Java IO系統總結



 

JavaIO總結

 

 

版本

修改內容

日期

修改人

V1.0

原始版本

2013-02-24

skywang

 

 

 

 

 

 

1 Java IO版本

Java庫的IO分為輸入/輸出兩部分。

早期的Java 1.0版本的輸入系統是InputStream及其子類,輸出系統是OutputStream及其子類。

后來的Java 1.1版本對IO系統進行了重新設計。輸入系統是Reader及其子類,輸出系統是Writer及其子類。

Java1.1之所以要重新設計,主要是為了添加國際化支持(即添加了對16位Unicode碼的支持)。具體表現為Java 1.0的IO系統是字節流,而Java 1.1的IO系統是字符流。

 

字節流,就是數據流中最小的數據單元是8位的字節。

字符流,就是數據流中最小的數據單元是16位的字符。

字節流在操作的時候,不會用到緩沖;而字符流會用到緩沖。所以,字符流的效率會更高一些。

至於為什么用到緩沖會效率更高一些呢?那是因為,緩沖本質上是一段內存區域;而文件大多是存儲在硬盤或者Nand Flash上面。讀寫內存的速度比讀寫硬盤或Nand Flash上文件的速度快很多!

 

目前,文件大多以字節的方式存儲的。所以在開發中,字節流使用較為廣泛。

 

 

2 Java 1.0和Java 1.1 的IO類的比較

 

表01_Java 1.0和Java 1.1的IO基本類對比表

Java 1.0 IO基本類(字節流)

Java 1.1 IO基本類(字符流)

InputStream

Reader  

OutputStream

Writer  

FileInputStream

FileReader

FileOutputStream

FileWriter

StringBufferInputStream

StringReader 

StringWriter

ByteArrayInputStream

CharArrayReader

ByteArrayOutputStream

CharArrayWriter

PipedInputStream

PipedReader

PipedOutputStream

PipedWriter

 

表02_Java 1.0和Java 1.1的IO裝飾器對比表

Java 1.0 IO裝飾器(字節流)

Java 1.1 IO裝飾器(字符流)

FilterInputStream

FilterReader

FilterOutputStream

FilterWriter(沒有子類的抽象類)

BufferedInputStream

BufferedReader(也有 readLine())

BufferedOutputStream

BufferedWriter

DataInputStream

PrintStream

PrintWriter

LineNumberInputStream

LineNumberReader

StreamTokenizer

 

PushBackInputStream

PushBackReader

 

之所以將Java IO系統分為基本類和裝飾器,是因為基本類主要是將流分為文件、字符串等不同種類,而裝飾器是為了實現“Decorator模式”(參考 “4 Decorator模式”)。

 

3 Java 1.0 IO系統介紹

因為Java 1.0與Java 1.1的IO系統的原理和使用方法都相似。所以,下面主要對Java 1.0的IO系統進行說明。

 

3.1輸入流

InputStream是字節輸入流的所有類的超類,它主要包括以下幾個常用的子類。

(01)ByteArrayInputStream

將Byte數組作為字節數組輸入流使用。

(02)StringBufferInputStream

將字符串作為字符串輸入流使用。已過時,不建議使用。

(03)FileInputStream

將文件或FileDescriptor作為文件輸入流使用。創建該輸入流時,傳遞的參數可以是“文件名”(String類型)、“File對象”或“FileDescriptor對象”(即可以是標准輸入流、輸出流、錯誤流的句柄)。

(04)PipedInputString

提供要寫入管道輸出流的所有數據字節。創建該輸入流的時候,可以指定對應的管道輸出輪流;這樣做的話,意味着將對應的管道輸入流連接到了管道輸出流。

(05)FilterInputStream

它直接繼承與InputStream,主要用於實現Decorator模式(這在后面進行說明)。

FilterInputStream主要有兩個派生類“DataInputStream”和“BufferedInputStream”。DataInputStream提供了讀取byte、char、int等基本類型和String的各種接口;BufferedInputStream提供了緩沖功能。

 

3.2輸出流

OutputStream是字節輸出流的所有類的超類,它主要包括以下幾個常用的子類。

(01)ByteArrayOutputStream

字節數組輸出流,其中的數據被寫入一個 byte 數組。緩沖區會隨着數據的不斷寫入而自動增長。可使用 toByteArray() 和 toString() 獲取數據。

(02)FileOutputStream

文件輸出流是用於將數據寫入 File 或 FileDescriptor 的輸出流。

  文件是否可用或能否可以被創建取決於基礎平台。特別是某些平台一次只允許一個 FileOutputStream(或其他文件寫入對象)打開文件進行寫入。在這種情況下,如果所涉及的文件已經打開,則此類中的構造方法將失敗。

(03)PipedOutputString

可以將管道輸出流連接到管道輸入流來創建通信管道。管道輸出流是管道的發送端。通常,數據由某個線程寫入 PipedOutputStream 對象,並由其他線程從連接的 PipedInputStream讀取。

  不建議對這兩個對象嘗試使用單個線程,因為這樣可能會造成該線程死鎖。如果某個線程正從連接的管道輸入流中讀取數據字節,但該線程不再處於活動狀態,則該管道被視為處於 毀壞 狀態。

(04)FilterOutputStream

它直接繼承與OutputStream,主要用於實現Decorator模式(這在后面進行說明)。

FilterOutputStream主要有兩個派生類“DataOutputStream”和“BufferedOutputStream”。DataOutputStream提供了寫入byte、char、int等基本類型和String的各種接口;BufferedOutputStream提供了緩沖功能。

 

 

4 Decorator模式

Decorator,裝飾模式,又稱為Wrapper。它的主要功能在於動態擴展一個類的功能。

JavaIO系統包括“文件流”、“字符串流”、“字節流”、“緩沖流”等。假如,我們同時需要多種數據流的功能,如輸入流和緩沖流。若采用繼承的方式,數量太可觀了。為了解決這一問題,Decorator模式實現了動態擴展,即在運行的時候動態的給一個類“裝飾”上某些功能。比如:

InputStream input = newBufferedInputStream(new FileInputStream(“test.txt”));

這就是將FileInputStream裝飾成了BufferedInputStream,使它具有了緩沖功能。

 

5 例子

package com.skywang;

 

import java.io.*;

public class IOTest{

    publicstatic voidmain(String[] args) throwsIOException {

       try {

            File f=newFile("d:123.txt");

            OutputStream out =

                  new BufferedOutputStream(

                      new FileOutputStream(f));

            String str="helloskywang!";

           

            byte[]b=str.getBytes();

            for(int i = 0; i < b.length; i++) {

                out.write(b[i]);

            }

            out.close();

       }catch (FileNotFoundException e){

           e.printStackTrace();

       }catch (SecurityException e){

           e.printStackTrace();

       }

    }

}

 

 

參考文獻:

1,JAVA API文檔

2,《Thinking In Java》

3,百度百科:http://baike.baidu.com/view/5020798.htm

4,java中的io系統詳解:http://blog.csdn.net/ilibaba/article/details/3955799

5,java中的IO整理(非常多的實例):http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html

6,深入Java 的IO 體系 - Decorator 模式的應用:http://www.doc88.com/p-817688448986.html

7,BufferedInputStream實現原理分析:http://www.software8.co/wzjs/java/1770.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM