java中的io中的(input/output)stream無(wú)非就是包括基于字符的stream、基于字節(jié)的stream和把字節(jié)導(dǎo)向的stream轉(zhuǎn)換
字符為導(dǎo)向的stream的stream。(很難理解么?)
以字節(jié)為導(dǎo)向的stream------InputStream/OutputStream
InputStream 和 OutputStream是兩個(gè)abstact類,對(duì)于字節(jié)為導(dǎo)向的stream都擴(kuò)展這兩個(gè)雞肋(基類^_^);
--InputStream
ByteArrayInputStream -- 把內(nèi)存中的一個(gè)緩沖區(qū)作為InputStream使用.
construct---ByteArrayInputStream(byte[])創(chuàng)建一個(gè)新字節(jié)數(shù)組輸入流,它從指定字節(jié)數(shù)組中讀取數(shù)據(jù)。
---ByteArrayInputStream(byte[], int, int) 創(chuàng)建一個(gè)新字節(jié)數(shù)組輸入流,它從指定字節(jié)數(shù)組中讀取數(shù)據(jù)。
---mark::該字節(jié)數(shù)組未被復(fù)制。
StringBufferInputStream -- 把一個(gè)String對(duì)象作為InputStream .
注釋:不推薦使用 StringBufferInputStream 方法。 此類不能將字符正確的轉(zhuǎn)換為字節(jié)。
同 JDK 1.1 版中的類似,從一個(gè)串創(chuàng)建一個(gè)流的最佳方法是采用 StringReader 類。
construct---StringBufferInputStream(String) 據(jù)指定串創(chuàng)建一個(gè)讀取數(shù)據(jù)的輸入流串。
FileInputStream -- 把一個(gè)文件作為InputStream,實(shí)現(xiàn)對(duì)文件的讀取操作
construct---FileInputStream(File) 創(chuàng)建一個(gè)輸入文件流,從指定的 File 對(duì)象讀取數(shù)據(jù)。
---FileInputStream(FileDescriptor) 創(chuàng)建一個(gè)輸入文件流,從指定的文件描述器讀取數(shù)據(jù)。
---FileInputStream(String) 創(chuàng)建一個(gè)輸入文件流,從指定名稱的文件讀取數(shù)據(jù)。
method ---- read() 從當(dāng)前輸入流中讀取一字節(jié)數(shù)據(jù)。
read(byte[]) 將當(dāng)前輸入流中 b.length 個(gè)字節(jié)數(shù)據(jù)讀到一個(gè)字節(jié)數(shù)組中。
read(byte[], int, int) 將輸入流中 len 個(gè)字節(jié)數(shù)據(jù)讀入一個(gè)字節(jié)數(shù)組中。
PipedInputStream:實(shí)現(xiàn)了pipe的概念,主要在線程中使用. 管道輸入流是指一個(gè)通訊管道的接收端。
一個(gè)線程通過(guò)管道輸出流發(fā)送數(shù)據(jù),而另一個(gè)線程通過(guò)管道輸入流讀取數(shù)據(jù),
這樣可實(shí)現(xiàn)兩個(gè)線程間的通訊。
PipedInputStream() 創(chuàng)建一個(gè)管道輸入流,它還未與一個(gè)管道輸出流連接。
PipedInputStream(PipedOutputStream) 創(chuàng)建一個(gè)管道輸入流, 它已連接到一個(gè)管道輸出流。
SequenceInputStream:把多個(gè)InputStream合并為一個(gè)InputStream .“序列輸入流”類允許應(yīng)用程序把幾個(gè)輸入流連續(xù)地合并起來(lái),
并且使它們像單個(gè)輸入流一樣出現(xiàn)。每個(gè)輸入流依次被讀取,直到到達(dá)該流的末尾。
然后“序列輸入流”類關(guān)閉這個(gè)流并自動(dòng)地切換到下一個(gè)輸入流。
SequenceInputStream(Enumeration) 創(chuàng)建一個(gè)新的序列輸入流,并用指定的輸入流的枚舉值初始化它。
SequenceInputStream(InputStream, InputStream) 創(chuàng)建一個(gè)新的序列輸入流,初始化為首先 讀輸入流 s1, 然后讀輸入流 s2。
--OutputSteam
ByteArrayOutputStream:把信息存入內(nèi)存中的一個(gè)緩沖區(qū)中.該類實(shí)現(xiàn)一個(gè)以字節(jié)數(shù)組形式寫(xiě)入數(shù)據(jù)的輸出流。
當(dāng)數(shù)據(jù)寫(xiě)入緩沖區(qū)時(shí),它自動(dòng)擴(kuò)大。用 toByteArray() 和 toString() 能檢索數(shù)據(jù)。
construct --- ByteArrayOutputStream() 創(chuàng)建一個(gè)新的字節(jié)數(shù)組輸出流。
--- ByteArrayOutputStream() 創(chuàng)建一個(gè)新的字節(jié)數(shù)組輸出流。
--- ByteArrayOutputStream(int) 創(chuàng)建一個(gè)新的字節(jié)數(shù)組輸出流,并帶有指定大小字節(jié)的緩沖區(qū)容量。
toString(String) 根據(jù)指定字符編碼將緩沖區(qū)內(nèi)容轉(zhuǎn)換為字符串,并將字節(jié)轉(zhuǎn)換為字符。
write(byte[], int, int) 將指定字節(jié)數(shù)組中從偏移量 off 開(kāi)始的 len 個(gè)字節(jié)寫(xiě)入該字節(jié)數(shù)組輸出流。
write(int) 將指定字節(jié)寫(xiě)入該字節(jié)數(shù)組輸出流。
writeTo(OutputStream) 用 out.write(buf, 0, count) 調(diào)用輸出流的寫(xiě)方法將該字節(jié)數(shù)組輸出流的全部?jī)?nèi)容寫(xiě)入指定的輸出流參數(shù)。
FileOutputStream:文件輸出流是向 File 或 FileDescriptor 輸出數(shù)據(jù)的一個(gè)輸出流。
FileOutputStream(File) 創(chuàng)建一個(gè)文件輸出流,向指定的 File 對(duì)象輸出數(shù)據(jù)。
FileOutputStream(FileDescriptor) 創(chuàng)建一個(gè)文件輸出流,向指定的文件描述器輸出數(shù)據(jù)。
FileOutputStream(String) 創(chuàng)建一個(gè)文件輸出流,向指定名稱的文件輸出數(shù)據(jù)。
FileOutputStream(String, boolean) 用指定系統(tǒng)的文件名,創(chuàng)建一個(gè)輸出文件。
PipedOutputStream:管道輸出流是指一個(gè)通訊管道的發(fā)送端。 一個(gè)線程通過(guò)管道輸出流發(fā)送數(shù)據(jù),
而另一個(gè)線程通過(guò)管道輸入流讀取數(shù)據(jù),這樣可實(shí)現(xiàn)兩個(gè)線程間的通訊。
PipedOutputStream() 創(chuàng)建一個(gè)管道輸出流,它還未與一個(gè)管道輸入流連接。
PipedOutputStream(PipedInputStream) 創(chuàng)建一個(gè)管道輸出流,它已連接到一個(gè)管道輸入流。
以字符為導(dǎo)向的stream Reader/Writer
以Unicode字符為導(dǎo)向的stream,表示以Unicode字符為單位從stream中讀取或往stream 中寫(xiě)入信息。
Reader/Writer 為abstact類
以Unicode字符為導(dǎo)向的stream包括下面幾種類型:
-- Reader
1) CharArrayReader:與ByteArrayInputStream對(duì)應(yīng)
CharArrayReader(char[]) 用指定字符數(shù)組創(chuàng)建一個(gè) CharArrayReader。
CharArrayReader(char[], int, int) 用指定字符數(shù)組創(chuàng)建一個(gè) CharArrayReader。
2) StringReader:與StringBufferInputStream對(duì)應(yīng)
StringReader(String) 創(chuàng)建一新的串讀取者。
3) FileReader:與FileInputStream對(duì)應(yīng)
4) PipedReader:與PipedInputStream對(duì)應(yīng)
-- Writer
1) CharArrayWrite:與ByteArrayOutputStream對(duì)應(yīng)
2) StringWrite:無(wú)與之對(duì)應(yīng)的以字節(jié)為導(dǎo)向的stream
3) FileWrite:與FileOutputStream對(duì)應(yīng)
4) PipedWrite:與PipedOutputStream對(duì)應(yīng)
兩種不現(xiàn)導(dǎo)向的stream之間的轉(zhuǎn)換
InputStreamReader和OutputStreamReader:把一個(gè)以字節(jié)為導(dǎo)向的stream轉(zhuǎn)換成一個(gè)以字符為導(dǎo)向的stream。
一個(gè) InputStreamReader 類是從字節(jié)流到字符流的橋梁:它讀入字節(jié),并根據(jù)指定的編碼方式,將之轉(zhuǎn)換為字符流。
使用的編碼方式可能由名稱指定,或平臺(tái)可接受的缺省編碼方式。
InputStreamReader 的 read() 方法之一的每次調(diào)用,可能促使從基本字節(jié)輸入流中讀取一個(gè)或多個(gè)字節(jié)。
為了達(dá)到更高效率,考慮用 BufferedReader 封裝 InputStreamReader,
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader(InputStream) 用缺省的字符編碼方式,創(chuàng)建一個(gè) InputStreamReader。
InputStreamReader(InputStream, String) 用已命名的字符編碼方式,創(chuàng)建一個(gè) InputStreamReader。
OutputStreamWriter 將多個(gè)字符寫(xiě)入到一個(gè)輸出流,根據(jù)指定的字符編碼將多個(gè)字符轉(zhuǎn)換為字節(jié)。
每個(gè) OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是從字符流到字節(jié)流的橋梁。
FilterInputStream、RandomAccessFile 見(jiàn)例子。
ObjectInputStream 、 ObjectOutputStream見(jiàn)另外blog。
Java IO的一般使用原則:
一、按數(shù)據(jù)來(lái)源(去向)分類:
1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
2、是byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、是Char[]: CharArrayReader, CharArrayWriter
4、是String: StringBufferInputStream, StringReader, StringWriter
5、網(wǎng)絡(luò)數(shù)據(jù)流:InputStream, OutputStream, Reader, Writer
二、按是否格式化輸出分:
1、要格式化輸出:PrintStream, PrintWriter
三、按是否要緩沖分:
1、要緩沖:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
四、按數(shù)據(jù)格式分:
1、二進(jìn)制格式(只要不能確定是純文本的): InputStream, OutputStream及其所有帶Stream結(jié)束的子類
2、純文本格式(含純英文與漢字或其他編碼方式);Reader, Writer及其所有帶Reader, Writer的子類
五、按輸入輸出分:
1、輸入:Reader, InputStream類型的子類
2、輸出:Writer, OutputStream類型的子類
六、特殊需要:
1、從Stream到Reader,Writer的轉(zhuǎn)換類:InputStreamReader, OutputStreamWriter
2、對(duì)象輸入輸出:ObjectInputStream, ObjectOutputStream
3、進(jìn)程間通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4、合并輸入:SequenceInputStream
5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
決定使用哪個(gè)類以及它的構(gòu)造進(jìn)程的一般準(zhǔn)則如下(不考慮特殊需要):
首先,考慮最原始的數(shù)據(jù)格式是什么: 原則四
第二,是輸入還是輸出:原則五
第三,是否需要轉(zhuǎn)換流:原則六第1點(diǎn)
第四,數(shù)據(jù)來(lái)源(去向)是什么:原則一
第五,是否要緩沖:原則三 (特別注明:一定要注意的是readLine()是否有定義,有什么比read, write更特殊的輸入或輸出方法)
第六,是否要格式化輸出:原則二
文章2:
首先是java的IO。這破東西可真費(fèi)事,I/O類庫(kù)常使用”流(stream)”這種抽象。所謂”流”是一種能生成或接受數(shù)據(jù)的,代表數(shù)據(jù)的源和目標(biāo)的對(duì)象。流把I/O設(shè)備內(nèi)部的具體操作給隱藏起來(lái)了。 正如JDK文檔所顯示的,Java的I/O類庫(kù)分成輸入和輸出兩大部分。所有InputStream和Reader的派生類都有一個(gè)基本的,繼承下來(lái)的,能讀取單個(gè)或byte數(shù)組的read( )方法。同理,所有OutputStream和Writer的派生類都有一個(gè)基本的,能寫(xiě)入單個(gè)或byte數(shù)組的write( )方法。但通常情況下,你是不會(huì)去用這些方法的;它們是給其它類用的 —— 而后者會(huì)提供一些更實(shí)用的接口。因此,你很少會(huì)碰到只用一個(gè)類就能創(chuàng)建一個(gè)流的情形,實(shí)際上你得把多個(gè)對(duì)象疊起來(lái),并以此來(lái)獲取所需的功能。Java的流類庫(kù)之所以會(huì)那么讓人犯暈,最主要的原因就是”你必須為創(chuàng)建一個(gè)流而動(dòng)用多個(gè)對(duì)象”。
Java的IO類結(jié)構(gòu):
根接口是InputStream/OutputStream,充當(dāng)數(shù)據(jù)源的IO類有FileInputStream/FileOutputStream,ByteArrayInputStream / ByteArrayOutputStream 等,充當(dāng)裝飾功能的IO類有BufferedInputStream / BufferedOutputStream,DataInputStream / DataOutputStream等,
它們都是繼承裝飾接口FilterInputStream/FilterOutputStream。
使用IO時(shí),首先創(chuàng)建一個(gè)數(shù)據(jù)源IO,然后根據(jù)需要的功能創(chuàng)建裝飾類IO,其構(gòu)造函數(shù)的參數(shù)為已創(chuàng)建的數(shù)據(jù)源IO。
我們以創(chuàng)建一個(gè)具有緩沖的文件輸入流為例,假定需要從磁盤(pán)讀取文件“C:\log.txt”:
// 創(chuàng)建一個(gè)FileInputStream:
FileInputStream fileInput = new FileInputStream(”C:\\log.txt”);
// 創(chuàng)建一個(gè)BufferedInputStream:
BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);
// 現(xiàn)在得到的bufferedInput即是具有緩沖的文件輸入流
或者進(jìn)一步簡(jiǎn)寫(xiě)如下:
InputStream input = new BufferedInputStream(new FileInputStream(”C:\\log.txt”));
// 現(xiàn)在得到的input即是具有緩沖的文件輸入流
java.io.Reader 和 java.io.InputStream 區(qū)別
java.io.Reader 和 java.io.InputStream 組成了 Java 輸入類。Reader 用于讀入16位字符,也就是 Unicode 編碼的字符;而 InputStream 用于讀入 ASCII 字符和二進(jìn)制數(shù)據(jù)。
在 Java 中,有不同類型的 Reader 輸入流對(duì)應(yīng)于不同的數(shù)據(jù)源:
FileReader 用于從文件輸入;
CharArrayReader 用于從程序中的字符數(shù)組輸入;
StringReader 用于從程序中的字符串輸入;
PipedReader 用于讀取從另一個(gè)線程中的 PipedWriter 寫(xiě)入管道的數(shù)據(jù)。
相應(yīng)的也有不同類型的 InputStream 輸入流對(duì)應(yīng)于不同的數(shù)據(jù)源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。另外,還有兩種沒(méi)有對(duì)應(yīng) Reader 類型的 InputStream 輸入流:
Socket 用于套接字;
URLConnection 用于 URL 連接。
這兩個(gè)類使用 getInputStream() 來(lái)讀取數(shù)據(jù)。
相應(yīng)的,java.io.Writer 和 java.io.OutputStream 也有類似的區(qū)別。
1、Java技術(shù)支持兩種數(shù)據(jù)類型的流
InputStream和OutputStream:字節(jié)流。其它字節(jié)流都是InputStream或OutputStream的子類。
Reader和 Writer:字符流。其它字符流都是Reader或Writer的子類。
2、節(jié)點(diǎn)流
Java 2 SDK中有三種基本類型的節(jié)點(diǎn):文件(file)、內(nèi)存(memory)、管道(pipe)。
3、過(guò)程流
過(guò)程流在其它流之上,完成排序、變換等操作。過(guò)程流也被稱做過(guò)濾流。
當(dāng)你需要改變輸入流的原始數(shù)據(jù)時(shí),你可以將一個(gè)過(guò)濾輸入流連接到一個(gè)原始的輸入流上。
用過(guò)濾流將原始數(shù)據(jù)變換成你需要的格式。
4、基本字節(jié)流類
4.1、FileInputStream和FileOutputStream
這兩個(gè)節(jié)點(diǎn)流用來(lái)操縱磁盤(pán)文件。這些類的構(gòu)造函數(shù)允許你指定它們所連接的文件。
要構(gòu)造一個(gè)FileInputStream,所關(guān)聯(lián)的文件必須存在而且是可讀的。
如果你要構(gòu)造一個(gè)FileOutputStream而輸出文件已經(jīng)存在,則它將被覆蓋。
FileInputStream infile = new FileInputStream(”myfile.dat”);
FileOutputStream outfile = new FileOutputStream(”results.dat”);
4.1、 BufferInputStream和BufferOutputStream
這些是過(guò)濾器流,它們可以提高I/O操作的效率。
4.3、 PipedInputStream和PipedOutputStream
管道流用來(lái)在線程間進(jìn)行通信。一個(gè)線程的PipedInputStream對(duì)象從另一個(gè)線程的PipedOutputStream對(duì)象讀取輸入。
要使管道流有用,必須有一個(gè)輸入方和一個(gè)輸出方。
4.4、 DataInputStream和DataOutputStream
這些過(guò)濾器通過(guò)流來(lái)讀寫(xiě)Java基本類
5、 基本字符流類
圖闡述了Reader和Writer字符流的體系結(jié)構(gòu)。
5.1、InputStreamReader 和 OutputStreamWriter
用于字節(jié)流與字符流之間的轉(zhuǎn)換接口。
當(dāng)你構(gòu)造一個(gè)InputStreamReader或OutputStreamWriter時(shí),轉(zhuǎn)換規(guī)則定義了16位Unicode和其它平臺(tái)的特定表示之間的轉(zhuǎn)換。
InputStreamReader從一個(gè)數(shù)據(jù)源讀取字節(jié),并自動(dòng)將其轉(zhuǎn)換成Unicode字符。
如果你特別聲明,InputStreamReade會(huì)將字節(jié)流轉(zhuǎn)換成其它種類的字符流。
OutputStreamWriter將字符的Unicode編碼寫(xiě)到輸出流,如果你的使用的不是Unicode字符,OutputStreamWriter會(huì)將你的字符編碼轉(zhuǎn)換成Unicode編碼。
5.2.、緩沖讀者和作者
因?yàn)樵诟鞣N格式之間進(jìn)行轉(zhuǎn)換和其它I/O操作很類似,所以在處理大塊數(shù)據(jù)時(shí)效率最高。
在InputStreamReader和OutputStreamWriter的結(jié)尾鏈接一個(gè)BufferedReader和BufferedWriter是一個(gè)好主意。
記住對(duì)BufferedWriter使用flush()方法。
5.3、 使用其它字符轉(zhuǎn)換
如果你需要從一個(gè)非本地(例如,從連接到一個(gè)不同類型的機(jī)器的網(wǎng)絡(luò)連接讀取)的字符編碼讀取輸入,
你可以象下面這個(gè)程序那樣,使用顯式的字符編碼構(gòu)造ir=new InputStreamReader(System.in, “8859_1″);
注:如果你通過(guò)網(wǎng)絡(luò)連接讀取字符,就應(yīng)該使用這種形式。
否則,你的程序會(huì)總是試圖將所讀取的字符當(dāng)作本地表示來(lái)進(jìn)行轉(zhuǎn)換,而這并不總是正確的。ISO 8859-1是映射到ASCII的Latin-1編碼模式。
6、 對(duì)象串行化
java.io.Serializable接口支持將一個(gè)Java技術(shù)對(duì)象存放到一個(gè)流中。
將一個(gè)對(duì)象存放到某種類型的永久存儲(chǔ)器上稱為”保持”。
如果一個(gè)對(duì)象可以被存放到磁盤(pán)或磁帶上,或者可以發(fā)送到另外一臺(tái)機(jī)器并存放到存儲(chǔ)器或磁盤(pán)上,那么這個(gè)對(duì)象就被稱為可保持的。
java.io.Serializable接口沒(méi)有任何方法,它只作為一個(gè)”標(biāo)記”,用來(lái)表明實(shí)現(xiàn)了這個(gè)接口的類可以串行化。
類中沒(méi)有實(shí)現(xiàn)Serializable接口的對(duì)象不能被保持。
// 文件實(shí)現(xiàn)追加:
// 其中的FileWriter()中的第二個(gè)參數(shù)的含義是:是否在文件中追加內(nèi)容
PrintWriter out = new PrintWriter(new FileWriter(logFileName, true), true);
Java讀寫(xiě)文件最常用的類是FileInputStream/FileOutputStream和FileReader/FileWriter。
其中FileInputStream和FileOutputStream是基于字節(jié)流的,常用于讀寫(xiě)二進(jìn)制文件。
讀寫(xiě)字符文件建議使用基于字符的FileReader和FileWriter,省去了字節(jié)與字符之間的轉(zhuǎn)換。
但這兩個(gè)類的構(gòu)造函數(shù)默認(rèn)使用系統(tǒng)的編碼方式,如果文件內(nèi)容與系統(tǒng)編碼方式不一致,可能會(huì)出現(xiàn)亂碼。
在這種情況下,建議使用FileReader和FileWriter的父類:InputStreamReader/OutputStreamWriter,
它們也是基于字符的,但在構(gòu)造函數(shù)中可以指定編碼類型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。
// 讀寫(xiě)文件的編碼:
InputStreamReader r = new InputStreamReader(new FileInputStream(fileName), “utf-8″);
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(fileName),”utf-8″);
/**
三種IO性能比較:
在讀寫(xiě)一個(gè)10k文件的時(shí)候,三種方式的耗時(shí)如下:
InputStreamReader And OutputStreamWriter : 63ms (可以設(shè)置文件的編碼,如果不用buffer)
BufferedReader And BufferedWriter : 31ms
BufferedInputStream And BufferedOutputStream : 16ms
*/
/**
* Description: Test the java IO’s efficiency
* Author: KevinChen
* Date: 2007-02-18
*/
import java.io.*;
/**
* using the InputStreamReader And OutputStreamWriter
*/
class EncoderRW {
public static String read(String fileName) throws IOException {
StringBuffer sb = new StringBuffer();
/*此處讀文件時(shí)用了buffer,如果不用,性能損失一倍*/
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), “utf-8″));
String s;
while((s = in.readLine()) != null) {
sb.append(s);
sb.append(”\n”);
}
in.close();
return sb.toString();
}
public void write(String fileName, String text) throws IOException {
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(fileName),”utf-8″);
out.write(text);
out.flush();
out.close();
}
}
/**
* using the BufferedReader And BufferedWriter
*/
class WriterReader {
public String read(String fileName) throws IOException {
StringBuffer sb = new StringBuffer();
BufferedReader in = new BufferedReader(new FileReader(fileName));
String s;
while((s = in.readLine()) != null) {
sb.append(s);
sb.append(”\n”);
}
in.close();
return sb.toString();
}
public void write(String fileName, String text) throws IOException {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
out.print(text);
out.close();
}
}
/**
* using the BufferedInputStream And BufferedOutputStream
*/
class BufferedStream{
public byte[] read(String fileName) throws IOException {
BufferedInputStream remoteBIS = new BufferedInputStream(new FileInputStream(fileName));
ByteArrayOutputStream baos = new ByteArrayOutputStream(10240);
byte[] buf = new byte[1024];
int bytesRead = 0;
while(bytesRead >= 0)
{
baos.write(buf, 0, bytesRead);
bytesRead = remoteBIS.read(buf);
}
byte[] content = baos.toByteArray();
return content;
}
public void write(String fileName, byte[] content) throws IOException {
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileName));
out.write(content);
out.flush();
out.close();
}
}
public class TestIO
{
public static void main(String[] args)throws IOException {
long currentTime = System.currentTimeMillis() ;
EncoderRW rw = new EncoderRW();
rw.write(”index.dat”,rw.read(”FileUtil.java”));
System.out.println(”cost time:” + Long.toString(System.currentTimeMillis()-currentTime) + ” ms”);
currentTime = System.currentTimeMillis() ;
WriterReader wr = new WriterReader();
wr.write(”index.dat”,wr.read(”FileUtil.java”));
System.out.println(”cost time:” + Long.toString(System.currentTimeMillis()-currentTime) + ” ms”);
currentTime = System.currentTimeMillis() ;
BufferedStream bf = new BufferedStream();
bf.write(”index.dat”,bf.read(”FileUtil.java”));
System.out.println(”cost time:” + Long.toString(System.currentTimeMillis()-currentTime) + ” ms”);
}
}