java中有兩套IO,一套是普通的IO,即jdk1.4之前就包含的IO,另一套是jdk1.4包括進來的nio。本文指的是普通的IO。java中的IO是基于流的。流的概念可以這樣理解,即數據好像實在一根管子里面流動,而管子的兩端連接什么,則需要根據具體的輸入輸出需要來確定了。比如說,我想從文件輸入到屏幕顯示,則管子的一端(輸入端)連接的是文件,另一端連接的是屏幕。這個比方可能不是很準確,但目前先大概這樣理解了:-)。

    java的io有兩類,一類是基于字節流的,基類是InputStream/OutputStream,另一類是基于字符流的,基類是Reader/Writer,注意基于Java的字符使用Unicode表示的,所以Reader/Writer的讀寫操作都似乎基于雙字節的Unicode代碼單元。

    下圖表示了Java io的結構(圖片來自:http://www.unix.com.ua/orelly/java-ent/jnut/figs/JN3_1101.gif):

    在學習時應該注意的是,基于字節的io和基于字符的io是有一定的對應關系的,掌握這些對應關系,可以更快的掌握java io。

    基于字節流的輸入的類:

  1) ByteArrayInputStream:把內存中的一個緩沖區作為InputStream使用

2) StringBufferInputStream:把一個String對象作為InputStream

3) FileInputStream:把一個文件作為InputStream,實現對文件的讀取操作

4) PipedInputStream:實現了pipe的概念,主要在線程中使用

5) SequenceInputStream:把多個InputStream合并為一個InputStream

基于字節流的輸出的類:

1) ByteArrayOutputStream:把信息存入內存中的一個緩沖區中

2) FileOutputStream:把信息存入文件中

3) PipedOutputStream:實現了pipe的概念,主要在線程中使用

4) SequenceOutputStream:把多個OutStream合并為一個OutStream

基于字符流的輸入的類:
  1) CharArrayReader:與ByteArrayInputStream對應
  2) StringReader:與StringBufferInputStream對應
  3) FileReader:與FileInputStream對應
  4) PipedReader:與PipedInputStream對應

基于字符流的輸出的類:
  1) CharArrayWrite:與ByteArrayOutputStream對應
  2) StringWrite:無與之對應的以字節為導向的stream
  3) FileWrite:與FileOutputStream對應
  4) PipedWrite:與PipedOutputStream對應

  以字符為導向的stream基本上對有與之相對應的以字節為導向的stream。兩個對應類實現的功能相同,只是在操作時的導向不同。如 CharArrayReader和ByteArrayInputStream的作用都是把內存中的一個緩沖區作為InputStream使用,所不同的 是前者每次從內存中讀取一個字節的信息,而后者每次從內存中讀取一個Unicode字符(2個字節)。

InputStreamReader和OutputStreamReader:把一個以字節為導向的stream轉換成一個以字符為導向的stream。

java中基于字節流的io還有一個重要的概念,裝飾類。即上圖中InputStream和OutputStream的子類中帶有Filter*類的子類,通過這些裝飾類可以給io添加新的功能。一個典型的應用實例便是如果想要一個基于字節流的文件輸入,而又想提高效率而采用緩沖的話,可以按照以下代碼實現:

File f = new File("c:\\test.dat);

FileInputStream fis = new FileInputStream(f);

BufferedInputStream bis = new BufferedInputStream(fis);

然后就可以對這個流采用帶有緩沖的輸入了。下面詳細介紹一下裝飾類:

InputStream的裝飾類:
  1) DataInputStream:從stream中讀取基本類型(int、char等)數據。
  2) BufferedInputStream:使用緩沖區
  3) LineNumberInputStream:會記錄input stream內的行數,然后可以調用getLineNumber()和setLineNumber(int)
  4) PushbackInputStream:很少用到,一般用于編譯器開發

OutputStream的裝飾類
  1) DataIOutputStream:往stream中輸出基本類型(int、char等)數據。
  2) BufferedOutputStream:使用緩沖區
  3) PrintStream:產生格式化輸出

在基于字符流的io中,與上述的基于字節流的裝飾類的對應關系如下:
       Reader的子類:
       1) 沒有與DataInputStream對應的類。除非在要使用readLine()時改用BufferedReader,否則使用DataInputStream
  2) BufferedReader:與BufferedInputStream對應
  3) LineNumberReader:與LineNumberInputStream對應
  4) PushBackReader:與PushbackInputStream對應

Writer的子類:
  1) BufferedWriter:與BufferedOutputStream對應
  2) PrintWriter:與PrintStream對應

如果想隨機讀寫文件,可以使用RandomAccessFile類:
  1) 可通過RandomAccessFile對象完成對文件的讀寫操作
  2) 在產生一個對象時,可指明要打開的文件的性質:r,只讀;w,只寫;rw可讀寫
  3) 可以直接跳到文件中指定的位置

參考:

徹底明白 Java 語言中的IO系統 http://dev.yesky.com/105/7570105.shtml

精通Java網絡編程 汪曉平 清華大學出版社 2005 9


文章來源:http://tangwei312tom.blog.163.com/blog/static/22473192200881410343504