Dict.CN 在線詞典, 英語(yǔ)學(xué)習(xí), 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          導(dǎo)航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          公告


          我的blog中的部分資源是來(lái)自于網(wǎng)絡(luò)上,如果你認(rèn)為侵犯了你的權(quán)利,請(qǐng)及時(shí)聯(lián)系jelver#163.com,我會(huì)盡快刪除!另外如果要留言最好通過(guò)郵件的形式跟我交流因?yàn)槲也皇呛芙?jīng)常寫(xiě)文章,前面有的朋友留言好久了我才發(fā)現(xiàn),所以對(duì)不住大家,現(xiàn)在留下MSN:jelver#163.com和QQ:253840881,歡迎交流! (用@代替#)

          隨筆分類

          文章分類

          隨筆檔案

          文章檔案

          相冊(cè)

          統(tǒng)計(jì)

          留言簿(23)

          積分與排名

          優(yōu)秀學(xué)習(xí)網(wǎng)站

          友情連接

          閱讀排行榜

          評(píng)論排行榜

          java中的io系統(tǒng)總結(jié)(轉(zhuǎn))

          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文檔所顯示的,JavaI/O類庫(kù)分成輸入和輸出兩大部分。所有InputStreamReader的派生類都有一個(gè)基本的,繼承下來(lái)的,能讀取單個(gè)或byte數(shù)組的read( )方法。同理,所有OutputStreamWriter的派生類都有一個(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”);
           }
          }


          posted on 2007-12-26 15:28 都市淘沙者 閱讀(2607) 評(píng)論(0)  編輯  收藏 所屬分類: Java Basic/Lucene/開(kāi)源資料

          主站蜘蛛池模板: 田阳县| 张家界市| 同德县| 虞城县| 佛山市| 济阳县| 南木林县| 建阳市| 万山特区| 香港| 布尔津县| 金华市| 无为县| 定远县| 太仓市| 达拉特旗| 文水县| 读书| 朝阳区| 红河县| 武隆县| 绥滨县| 台北县| 横峰县| 瓦房店市| 克拉玛依市| 天柱县| 河南省| 和平区| 武宁县| 龙里县| 故城县| 海宁市| 武隆县| 景泰县| 广昌县| 漳浦县| 无为县| 新余市| 全椒县| 清水河县|