小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java IO淺析

 dddTTLee 2010-11-30

什么是流:

 

流是一個(gè)抽象的概念。當(dāng)Java程序需要從數(shù)據(jù)源讀取數(shù)據(jù)時(shí),會(huì)開(kāi)啟一個(gè)到數(shù)據(jù)源的流。數(shù)據(jù)源可以是文件,內(nèi)存或者網(wǎng)絡(luò)等。同樣,當(dāng)程序需要輸出數(shù)據(jù)到目的地時(shí)也一樣會(huì)開(kāi)啟一個(gè)流,數(shù)據(jù)目的地也可以是文件、內(nèi)存或者網(wǎng)絡(luò)等。流的創(chuàng)建是為了更方便地處理數(shù)據(jù)的輸入輸出。

 

流分為字節(jié)流和字符流。字節(jié)流也稱(chēng)為原始數(shù)據(jù),需要用戶(hù)讀入后進(jìn)行相應(yīng)的編碼轉(zhuǎn)換。而字節(jié)流的實(shí)現(xiàn)是基于自動(dòng)轉(zhuǎn)換的,讀取數(shù)據(jù)時(shí)會(huì)把數(shù)據(jù)按照J(rèn)VM的默認(rèn)編碼自動(dòng)轉(zhuǎn)換成字符。

 

字節(jié)流由InputStream和OutputStream處理,而字符流由Reader和Writer處理。Reader和Writer是Java后加入的處理類(lèi),出于讓數(shù)據(jù)的處理更方便的目的。

 

字節(jié)流處理概述:

 

對(duì)于字節(jié)流處理的類(lèi)都繼承自InputStream和OutputStream這兩個(gè)抽象類(lèi)。

 

InputStream提供的最重要的方法是:

 

Java代碼 復(fù)制代碼
  1. read();   
  2. read(byte[] b) ;   
  3. read(byte[] b, int off, int len) ;  

 

用于從輸入流中讀取字節(jié)。

 

OutputStream提供的最重要的方法是:

 

Java代碼 復(fù)制代碼
  1. write(int b);   
  2. write(byte[] b);   
  3. write(byte[] b, int off, int len)   
 

用于將字節(jié)寫(xiě)入輸出流。

 

字節(jié)流處理類(lèi)概述:

 

字節(jié)流的處理類(lèi)有很多,他們都繼承自InputStream或者OutputStream抽象類(lèi)。

 

輸入流:

 

先談?wù)勢(shì)斎肓鳎斎肓髦懈鷶?shù)據(jù)源直接接觸的類(lèi)有:FileInputStream和ByteArrayInputStream,他們分別實(shí)現(xiàn)了從文件或者內(nèi)存中的字節(jié)數(shù)組讀入數(shù)據(jù)到輸入流。

 

其他的輸入流處理類(lèi)都是裝飾類(lèi)(Decorator模式),下面對(duì)他們進(jìn)行一下簡(jiǎn)單介紹:

 

BufferedInputStream: 提供了緩沖功能。

DataInputStream: 允許應(yīng)用程序以與機(jī)器無(wú)關(guān)方式從底層輸入流中讀取基本 Java 數(shù)據(jù)類(lèi)型。應(yīng)用程序可以使用數(shù)據(jù)輸出流寫(xiě)入稍后由數(shù)據(jù)輸入流讀取的數(shù)據(jù)。

PipedInputStream: 允許以管道的方式來(lái)處理流。當(dāng)連接到一個(gè)PipedOutputStream后,它會(huì)讀取后者輸出到管道的數(shù)據(jù)。

PushbackInputStream: 允許放回已經(jīng)讀取的數(shù)據(jù)。

SequenceInputStream: 能對(duì)多個(gè)inputstream進(jìn)行順序處理。

 

輸出流:

 

基本上每個(gè)輸入流類(lèi)都有一個(gè)相應(yīng)的輸出流類(lèi),提供相應(yīng)的輸出流處理。

同樣,跟數(shù)據(jù)目的地直接接觸的類(lèi)有:FileOutputStream和ByteArrayOutputStream,前者實(shí)現(xiàn)了把數(shù)據(jù)流寫(xiě)入文件的功能,后者實(shí)現(xiàn)了一個(gè)輸出流,其中的數(shù)據(jù)被寫(xiě)入一個(gè) byte 數(shù)組。緩沖區(qū)會(huì)隨著數(shù)據(jù)的不斷寫(xiě)入而自動(dòng)增長(zhǎng)。可使用 toByteArray()toString() 獲取數(shù)據(jù)。

 

下面對(duì)其它的裝飾類(lèi)做一下簡(jiǎn)單介紹:

BufferedOutputStream: 提供了緩沖功能的輸出流,在寫(xiě)出完成之前要調(diào)用flush來(lái)保證數(shù)據(jù)的輸出。

DataOutputStream: 數(shù)據(jù)輸出流允許應(yīng)用程序以適當(dāng)方式將基本 Java 數(shù)據(jù)類(lèi)型寫(xiě)入輸出流中。然后,應(yīng)用程序可以使用數(shù)據(jù)輸入流將數(shù)據(jù)讀入。

PipedOutputStream: 允許以管道的方式來(lái)處理流。可以將管道輸出流連接到管道輸入流來(lái)創(chuàng)建通信管道。管道輸出流是管道的發(fā)送端。通常,數(shù)據(jù)由某個(gè)線(xiàn)程寫(xiě)入 PipedOutputStream 對(duì)象,并由其他線(xiàn)程從連接的 PipedInputStream 讀取。

PrintStream: 為其他輸出流添加了功能,使它們能夠方便地打印各種數(shù)據(jù)值表示形式。我們經(jīng)常用到的System.out或者System.err都是PrintStream。

 

字符流處理概述:

 

所有的字符流操作類(lèi)都繼承自Reader或者Writer這兩個(gè)抽象類(lèi)。

 

Reader提供的重要方法有:

 

Java代碼 復(fù)制代碼
  1. read(char[] cbuf);   
  2. read(char[] cbuf, int off, int len);   
  3. read(CharBuffer target);  

 

他們提供了從流中讀取數(shù)據(jù)到字符數(shù)組或者CharBuffer的功能。

 

Writer提供的重要方法有:

 

Java代碼 復(fù)制代碼
  1. write(char[] cbuf);   
  2. write(char[] cbuf, int off, int len);   
  3. write(int c);   
  4. write(String str);   
  5. write(String str, int off, int len);  

 

他們提供了把字符、字符數(shù)組或者字符串寫(xiě)入流中的功能。

 

字符流處理類(lèi)概述:

 

輸入流:

 

跟數(shù)據(jù)源直接接觸的類(lèi):

CharArrayReader: 從內(nèi)存中的字符數(shù)組中讀入數(shù)據(jù),以對(duì)數(shù)據(jù)進(jìn)行流式讀取。

StringReader:從內(nèi)存中的字符串讀入數(shù)據(jù),以對(duì)數(shù)據(jù)進(jìn)行流式讀取。

FileReader:從文件中讀入數(shù)據(jù)。注意這里讀入數(shù)據(jù)時(shí)會(huì)根據(jù)JVM的默認(rèn)編碼對(duì)數(shù)據(jù)進(jìn)行內(nèi)轉(zhuǎn)換,而不能指定使用的編碼。所以當(dāng)文件使用的編碼不是JVM默認(rèn)編碼時(shí),不要使用這種方式。要正確地轉(zhuǎn)碼,使用InputStreamReader。

 

裝飾類(lèi):

BufferedReader:提供緩沖功能,可以讀取行:readLine();

LineNumberReader: 提供讀取行的控制:getLineNumber()等方法。

InputStreamReader: 字節(jié)流通向字符流的橋梁:它使用指定的 charset 讀取字節(jié)并將其解碼為字符。

 

輸出流:

 

根數(shù)據(jù)目的相關(guān)的類(lèi):

CharArrayWriter:把內(nèi)存中的字符數(shù)組寫(xiě)入輸出流,輸出流的緩沖區(qū)會(huì)自動(dòng)增加大小。輸出流的數(shù)據(jù)可以通過(guò)一些方法重新獲取。

StringWriter: 一個(gè)字符流,可以用其回收在字符串緩沖區(qū)中的輸出來(lái)構(gòu)造字符串。

FileWriter:把數(shù)據(jù)寫(xiě)入文件。

 

裝飾類(lèi):

BufferedWriter:提供緩沖功能。

OutputStreamWriter:字符流通向字節(jié)流的橋梁:可使用指定的 charset 將要寫(xiě)入流中的字符編碼成字節(jié)。

PrintWriter: 向文本輸出流打印對(duì)象的格式化表示形式。

 

流處理中的其它方法:

 

mark和reset用于重復(fù)讀取某段的數(shù)據(jù),如下代碼:

 

Java代碼 復(fù)制代碼
  1. is = new BufferedInputStream(new FileInputStream("res/input.data"));   
  2. assertTrue(is.available() > 0);   
  3. assertTrue(is.markSupported());   
  4.   
  5. // The read limit has no effect.   
  6. is.mark(0);   
  7.   
  8. int first = is.read();   
  9. int second = is.read();   
  10.   
  11. is.reset();   
  12. int firstAgain = is.read();   
  13. int secondAgain = is.read();   
  14.   
  15. assertEquals(first, firstAgain);   
  16. assertEquals(second, secondAgain);  

 

Writer或者OutputStream中的flush(): 刷新該流的緩沖,用于確保數(shù)據(jù)的輸出。

 

close(): 關(guān)閉流并釋放與之關(guān)聯(lián)的所有系統(tǒng)資源。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多