日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java listen_Java进阶-IO基础

發(fā)布時間:2023/12/13 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java listen_Java进阶-IO基础 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

計算機最重要的功能是處理數(shù)據(jù)。一個有用的計算機語言需要擁有良好的IO功能,以便讓未處理的數(shù)據(jù)流入程序,讓已處理的數(shù)據(jù)流出。

與其他語言相比,Java的IO功能顯得復雜。在其他語言中,許多IO功能(比如讀取文件),是被封裝好的,可以用一兩行程序?qū)崿F(xiàn)。在Java中,程序員往往需要多個層次的裝飾(decoration),才能實現(xiàn)文件讀取。

相對的復雜性帶來的好處是IO的靈活性。在Java中,程序員可以控制IO的整個流程,從而設計出最好的IO方式。我們將在下文看到更多。

IO示例

下面是我用于演示的文件file.txt

Hello?World!

Hello?Nerd!

我們先來研究一個文件讀取的例子:

import?java.io.*;

public?class?Test?{

public?static?void?main(String[]?args)?{

try?{

BufferedReader?br?=?new?BufferedReader(new?FileReader("file.txt"));

String?line?=?br.readLine();

while?(line?!=?null)?{

System.out.println(line);

line?=?br.readLine();

}

br.close();

}?catch?(IOException?e)?{

System.out.println("IO?Problem");

}

}

}

這段程序中包含一個try...catch...finally的異常處理器。可參考Java進階02 異常處理

裝飾器與功能組合

程序IO的關鍵在于創(chuàng)建BufferedReader對象br:

BufferedReader br = new BufferedReader(new FileReader("file.txt"));

在創(chuàng)建的過程中,我們先建立了一個FileReader對象,這個對象的功能是從文件"file.txt"中讀取字節(jié)(byte)流,并轉(zhuǎn)換為文本流。在Java中,標準的文本編碼方式為unicode。BufferedReader()接收該FileReader對象,并拓展FileReader的功能,新建出一個BufferedReader對象。該對象除了有上述的文件讀取和轉(zhuǎn)換的功能外,還提供了緩存讀取(buffered)的功能。最后,我們通過對br對象調(diào)用readLine()方法,可以逐行的讀取文件。

(緩存讀取是在內(nèi)存中開辟一片區(qū)域作為緩存,該區(qū)域存放FileReader讀出的文本流。當該緩存的內(nèi)容被讀走后(比如readLine()命令),緩存會加載后續(xù)的文本流。)

BufferedReader()是一個裝飾器(decorator),它接收一個原始的對象,并返回一個經(jīng)過裝飾的、功能更復雜的對象。修飾器的好處是,它可以用于修飾不同的對象。我們這里被修飾的是從文件中讀取的文本流。其他的文本流,比如標準輸入,網(wǎng)絡傳輸?shù)牧鞯鹊?#xff0c;都可以被BufferedReader()修飾,從而實現(xiàn)緩存讀取。

下圖顯示了br的工作方式,數(shù)據(jù)自下而上流動:

上述的裝飾過程與Linux中的文本流思想很相似。在Linux中,我們使用類似函數(shù)的方式來處理和傳遞文本流。在Java中,我們使用了裝飾器。但它們的目的都類似,就是實現(xiàn)功能的模塊化和自由組合。

更多的組合

事實上,Java提供了豐富的裝飾器。FileReader中合并了讀取和轉(zhuǎn)換兩個步驟,并采用了常用的默認設置,比如編碼采取unicode。我們可以使用FileInputStream?+?InputStreamReader的組合來替代FileReader,從而分離讀取字節(jié)和轉(zhuǎn)換兩個步驟,并對兩個過程有更好的控制。

(當然,FileReader的使用更加方便。InputStreamReader是將FileInputStream轉(zhuǎn)換成一個Reader,用于處理unicode文本)

箭頭表示數(shù)據(jù)流動方向

流的讀寫來自于四個基類:?InputStream,?OutputStream,?Reader和Writer。InputStream和Reader是處理讀取操作,OutputStream和Writer是處理寫入操作。它們都位于java.io包中。繼承關系如下:

java.io

此外,IOException有如下衍生類:

IOException

Reader和Writer及其衍生類是處理unicode文本。如我們看到的Buffered Reader, InputStreamReader或者FileReader。

InputStream和OutputStream及其衍生類是處理字節(jié)(byte)流。計算機中的數(shù)據(jù)都可以認為是字節(jié)形式,所以InputStream和OutputStream可用于處理更加廣泛的數(shù)據(jù)。比如我們可以使用下面的組合來讀取壓縮文件中包含的數(shù)據(jù)(比如整數(shù)):

箭頭表示數(shù)據(jù)流動方向

我們從壓縮文件中讀出字節(jié)流,然后解壓縮,最終讀出數(shù)據(jù)。

寫入

寫入(write)操作與讀取操作相似。我們可以通過使用裝飾,實現(xiàn)復雜的寫入功能。這里是一個簡單的寫入文本的例子:

import?java.io.*;

public?class?Test?{

public?static?void?main(String[]?args)?{

try?{

String?content?=?"Thank?you?for?your?fish.";

File?file?=?new?File("new.txt");?//?create?the?file?if?doesn't

//?exists

if?(!file.exists())?{

file.createNewFile();

}

FileWriter?fw?=?new?FileWriter(file.getAbsoluteFile());

BufferedWriter?bw?=?new?BufferedWriter(fw);

bw.write(content);

bw.close();

}?catch?(IOException?e)?{

System.out.println("IO?Problem");

}

}

}

上面創(chuàng)建了file對象,用于處理文件路徑。

總結(jié)

這里只是對Java IO的基本介紹。Java的IO相對比較復雜。Java程序員需要花一些時間來熟悉java.io中的類及其功能。

By Facker:

package?blogjavaTest;

import?java.io.*;

/**

*?@author?Facker

*?@title?Reader?Writer

*?@value?文件的寫入和讀出

*/

public?class?Test?{

void?test()?{

try?{

String?content?=?"Thank?you?for?Vamei.";

File?file?=?new?File("F:new.txt");?//?create?the?file?if?doesn't

//?exists

if?(!file.exists())?{

file.createNewFile();

}

FileWriter?fw?=?new?FileWriter(file.getAbsoluteFile());

BufferedWriter?bw?=?new?BufferedWriter(fw);

bw.write(content);

bw.close();

}?catch?(IOException?e)?{

System.out.println("IO?Problem");

}

}

void?test1()?{

try?{

BufferedReader?br?=?new?BufferedReader(new?FileReader("F:new.txt"));

String?line?=?br.readLine();

while?(line?!=?null)?{

System.out.println(line);

line?=?br.readLine();

}

br.close();

}?catch?(IOException?e)?{

System.out.println("IO?Problem");

}

}

public?static?void?main(String[]?args)?{

Test?s?=?new?Test();

s.test();?//?寫入

s.test1();//?讀出

}

}

總結(jié)

以上是生活随笔為你收集整理的java listen_Java进阶-IO基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。