Java中的流、字符流和字節流

1、什麼是流:java

流是一個抽象的概念。當Java程序須要從數據源讀取數據時,會開啓一個到數據源的流。數據源能夠是文件,內存或者網絡等。一樣,當程序須要輸出數據到目的地時也同樣會開啓一個流,數據目的地也能夠是文件、內存或者網絡等。流的建立是爲了更方便地處理數據的輸入輸出。數組

流分爲字節流和字符流。字節流也稱爲原始數據,須要用戶讀入後進行相應的編碼轉換。而字符流的實現是基於自動轉換的,讀取數據時會把數據按照JVM的默認編碼自動轉換成字符。網絡

字節流由InputStream和OutputStream處理,而字符流由Reader和Writer處理。Reader和Writer是Java後加入的處理類,出於讓數據的處理更方便的目的。dom

 

2、字節流和字符流編碼

      若是數據流中最小的數據單元是字節,那麼稱這種流爲字節流;若是數據流中最小的數據單元是字符,那麼稱這種流爲字符流。在Java的IO系統中,java.io.InputStream和java.io.OutputStream分別表示字節輸入流字節輸出流,java.io.Reader和java.io.Writer分別表示字符輸入流字符輸出流線程

I/O流的層次code

1.字節流:對象

從InputStream和OutputStream派生出來的一系列類。這類流以字節(byte)爲基本處理單位。繼承

◇ InputStream、OutputStream接口

  ◇ FileInputStream、FileOutputStream(文件流)

  ◇ PipedInputStream、PipedOutputStream

  ◇ ByteArrayInputStream、ByteArrayOutputStream

  ◇ FilterInputStream、FilterOutputStream

  ◇ DataInputStream、DataOutputStream (原始型數據流,

                                            他們是在普通流上加了讀寫原始型數據的功能,因此構造他們時要先構造普通流方法:

                                             readBoolean()/writeBoolean()

                                             readByte()/writeByte()

                                             readChar()/writeByte()      )

  ◇ BufferedInputStream、BufferedOutputStream(緩衝區流)

 2.字符流:

從Reader和Writer派生出的一系列類,這類流以16位的Unicode碼錶示的字符爲基本處理單位。

◇ Reader、Writer

  ◇ InputStreamReader、OutputStreamWriter

    ◇ PipedReader、PipedWriter

  ◇ FileReader、FileWriter

  ◇ CharArrayReader、CharArrayWriter

  ◇ FilterReader、FilterWriter

  ◇ BufferedReader、BufferedWriter

  ◇ StringReader、StringWriter

 3.對象流

  ◇ ObjectInputStream、ObjectOutputStream(

           串行化:對象經過寫出描述本身狀態的數值來記述本身的過程叫串行化

           對象流:可以輸入輸出對象的流

           將串行化的對象經過對象流寫入文件或傳送到其餘地方,對象流是在普通流上加了傳輸對象的功能,因此構造對象流時要先構造普通文件流

           注意:只有實現了Serializable接口的類才能被串行化)

 

4.其它

  ◇ 文件處理:

  File、RandomAccessFile;

  ◇ 接口

  DataInput、DataOutput、ObjectInput、ObjectOutput
3、字節流

    1. 處理概述:  

對於字節流處理的類都繼承自InputStream和OutputStream這兩個抽象類。

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

Java代碼

  1. read();   
  2. read(byte[] b) ;   
  3. read(byte[] b, int off, int len) ;  

 

用於從輸入流中讀取字節。

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

Java代碼

  1. write(int b);   
  2. write(byte[] b);   
  3. write(byte[] b, int off, int len)   

用於將字節寫入輸出流。

2. 字節流:

字節流的處理類有不少,他們都繼承自InputStream或者OutputStream抽象類。

輸入流: 

先談談輸入流,輸入流中跟數據源直接接觸的類:FileInputStream和ByteArrayInputStream,他們分別實現了從文件或者內存中的字節數組讀入數據到輸入流。

 

其餘的輸入流處理類都是裝飾類(Decorator模式),下面對他們進行一下簡單介紹: 

BufferedInputStream: 提供了緩衝功能。

DataInputStream: 容許應用程序以與機器無關方式從底層輸入流中讀取基本 Java 數據類型。應用程序可使用數據輸出流寫入稍後由數據輸入流讀取的數據。

PipedInputStream: 容許以管道的方式來處理流。當鏈接到一個PipedOutputStream後,它會讀取後者輸出到管道的數據。

PushbackInputStream: 容許放回已經讀取的數據。

SequenceInputStream: 能對多個inputstream進行順序處理。

 

輸出流:

基本上每一個輸入流類都有一個相應的輸出流類,提供相應的輸出流處理。

一樣,跟數據目的地直接接觸的類有:FileOutputStream和ByteArrayOutputStream,前者實現了把數據流寫入文件的功能,後者實現了一個輸出流,其中的數據被寫入一個 byte 數組。緩衝區會隨着數據的不斷寫入而自動增加。可以使用 toByteArray() 和 toString() 獲取數據。

下面對其它的裝飾類作一下簡單介紹:

BufferedOutputStream: 提供了緩衝功能的輸出流,在寫出完成以前要調用flush來保證數據的輸出。

DataOutputStream: 數據輸出流容許應用程序以適當方式將基本 Java 數據類型寫入輸出流中。而後,應用程序可使用數據輸入流將數據讀入。

PipedOutputStream: 容許以管道的方式來處理流。能夠將管道輸出流鏈接到管道輸入流來建立通訊管道。管道輸出流是管道的發送端。一般,數據由某個線程寫入 PipedOutputStream 對象,並由其餘線程從鏈接的 PipedInputStream 讀取。

PrintStream: 爲其餘輸出流添加了功能,使它們可以方便地打印各類數據值表示形式。咱們常常用到的System.out或者System.err都是PrintStream。

 4、字符流:

1.  字符流處理概述

全部的字符流操做類都繼承自Reader或者Writer這兩個抽象類。

Reader提供的重要方法有:

Java代碼

  1. read(char[] cbuf);   
  2. read(char[] cbuf, int off, int len);   
  3. read(CharBuffer target);  

 

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

 

Writer提供的重要方法有:

Java代碼

  1. write(char[] cbuf);   
  2. write(char[] cbuf, int off, int len);   
  3. write(int c);   
  4. write(String str);   

write(String str, int off, int len);  

他們提供了把字符、字符數組或者字符串寫入流中的功能。

 

   2. 字符流處理

 

輸入流:

       跟數據源直接接觸的類:

CharArrayReader: 從內存中的字符數組中讀入數據,以對數據進行流式讀取。

StringReader:從內存中的字符串讀入數據,以對數據進行流式讀取。

FileReader:從文件中讀入數據。注意這裏讀入數據時會根據JVM的默認編碼對數據進行內轉換,而不能指定使用的編碼。因此當文件使用的編碼不是JVM默認編碼時,不要使用這種方式。要正確地轉碼,使用InputStreamReader。

 

   裝飾類:

BufferedReader:提供緩衝功能,能夠讀取行:readLine();

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

InputStreamReader: 字節流通向字符流的橋樑:它使用指定的 charset 讀取字節並將其解碼爲字符。

 

輸出流:

 

根數據目的相關的類

CharArrayWriter:把內存中的字符數組寫入輸出流,輸出流的緩衝區會自動增長大小。輸出流的數據能夠經過一些方法從新獲取。

StringWriter: 一個字符流,能夠用其回收在字符串緩衝區中的輸出來構造字符串。

FileWriter:把數據寫入文件。

 

裝飾類:

BufferedWriter:提供緩衝功能。

OutputStreamWriter:字符流通向字節流的橋樑:可以使用指定的 charset 將要寫入流中的字符編碼成字節。

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

 

流處理中的其它方法:

mark和reset用於重複讀取某段的數據,以下代碼:

     Java代碼

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

Writer或者OutputStream中的flush(): 刷新該流的緩衝,用於確保數據的輸出。

 

 

小結

a. 字節流:

InputStream

|-- FileInputStream (基本文件流)

|-- BufferedInputStream

|-- DataInputStream

|-- ObjectInputStream

OutputStream 同上圖

BufferedInputStream,DataInputStream,ObjectInputStream 只是在FileInputStream 上增添了相應的功能,構造時先構造FileInputStream

 

b. 字符流:

Reader

|-- InputStreamReader (byte->char 橋樑)

|-- BufferedReader (經常使用)

Writer

|-- OutputStreamWriter (char->byte 橋樑)

|-- BufferedWriter

|-- PrintWriter (經常使用)

此文爲轉載備用,未知原文連接,若是侵犯了做者版權,請站內聯繫

相關文章
相關標籤/搜索