詳解JAVA I/O之二——java.io階層

來源:互聯網
上載者:User
java I/O(Input/Output)學習——java.io階層

文章分類:Java編程stream代表的是任何有能力產出資料的資料來源,或是任何有能力接收資料的接收源。在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括兩種類型: 
(1)位元組流 

  表示以位元組為單位從stream中讀取或往stream中寫入資訊,即io包中的inputstream類和outputstream類的衍生類別。通常用來讀取位元據,象和聲音。 

(2)字元流 

以Unicode字元為導向的stream,表示以Unicode字元為單位從stream中讀取或往stream中寫入資訊。 

區別: 

Reader和Writer要解決的,最主要的問題就是國際化。原先的I/O類庫只支援8位的位元組流,因此不可能很好地處理16位的Unicode字元流。Unicode是國際化的字元集(更何況Java內建的char就是16位的Unicode字元),這樣加了Reader和Writer之後,所有的I/O就都支援Unicode了。此外新類庫的效能也比舊的好。 

但是,Read和Write並不是取代InputStream和OutputStream,有時,你還必須同時使用"基於byte的類"和"基於字元的類"。為此,它還提供了兩個"適配器(adapter)"類。InputStreamReader負責將InputStream轉化成Reader,而OutputStreamWriter則將OutputStream轉化成Writer。 
一.流的階層 
定義: 
(1) java將讀取資料對象成為輸入資料流,能向其寫入的對象叫輸出資料流。結構圖如下:輸入資料流: 
 
輸出資料流 
 

二.InputStream類 

inputstream類和outputstream類都為抽象類別,不能建立對象,可以通過子類來執行個體化。 

InputStream是輸入位元組資料用的類,所以InputStream類提供了3種重載的read方法.Inputstream類中的常用方法: 

(1)       public abstract int read( ):讀取一個byte的資料,傳回值是高位補0的int類型值。 

(2)       public int read(byte  b[ ]):讀取b.length個位元組的資料放到b數組中。傳回值是讀取的位元組數。該方法實際上是調用下一個方法實現的 

(3)       public int read(byte  b[ ], int  off, int  len):從輸入資料流中最多讀取len個位元組的資料,存放到位移量為off的b數組中。 

(4)       public int available( ):返回輸入資料流中可以讀取的位元組數。注意:若輸入阻塞,當前線程將被掛起,如果InputStream對象調用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調用才有用, 

(5)       public long skip(long  n):忽略輸入資料流中的n個位元組,傳回值是實際忽略的位元組數, 跳過一些位元組來讀取 

(6)       public int close( ) :我們在使用完後,必須對我們開啟的流進行關閉. 

三.OutputStream類 

OutputStream提供了3個write方法來做資料的輸出,這個是和InputStream是相對應的。 

1.  public void write(byte  b[ ]):將參數b中的位元組寫到輸出資料流。 

2. public void write(byte  b[ ], int  off, int  len) :將參數b的從位移量off開始的len個位元組寫到輸出資料流。 

3. public abstract void write(int  b) :先將int轉換為byte類型,把低位元組寫入到輸出資料流中。 

4. public void flush( ) : 將資料緩衝區中資料全部輸出,並清空緩衝區。 

5. public void close( ) : 關閉輸出資料流並釋放與流相關的系統資源。 

注意: 

1. 上述各方法都有可能引起異常。 

2.  InputStream 和OutputStream都是抽象類別,不能建立這種類型的對象。 

四.FileInputStream類 

FileInputStream類是 InputStream類的子類,用來處理以檔案作為資料輸入源的資料流。使用方法: 

方式1: 

File fin=new File("d:/abc.txt"); 

   FileInputStream  in=new FileInputStream(fin); 

方式2: 

   FileInputStream  in=new 

            FileInputStream("d: /abc.txt"); 

方式3: 

建構函式將 FileDescriptor()對象作為其參數。 

FileDescriptor() fd=new FileDescriptor(); 

FileInputStream f2=new FileInputStream(fd); 

五.FileOutputStream 類 

FileOutputStream類用來處理以檔案作為資料輸出目的資料流;一個表示檔案名稱的字串,也可以是File或FileDescriptor對象。 

建立一個檔案流對象有兩種方法: 

方式1: 

File f=new File("d:/abc.txt"); 

FileOutputStream  out=new FileOutputStream (f); 

方式2: 

   FileOutputStream out=new 

       FileOutputStream("d:/abc.txt"); 

方式3:建構函式將 FileDescriptor() 對象作為其參數。 

FileDescriptor() fd=new FileDescriptor(); 

FileOutputStream f2=new FileOutputStream(fd); 

方式4:建構函式將檔案名稱作為其第一參數,將布爾值作為第二參數。 

FileOutputStream f=new FileOutputStream("d:/abc.txt",true); 

注意: 

(1)檔案中寫資料時,若檔案已經存在,則覆蓋存在的檔案;(2)的讀/寫操作結束時,應調用close方法關閉流。 

舉例:2-1 

六.File類 

File類與InputStream / OutputStream類同屬於一個包,它不允許訪問檔案內容。 

File類主要用於命名檔案、查詢檔案屬性和處理檔案目錄。 

舉例:2-2 

七.從一個流構造另一個流 

java的流類提供了結構化方法,如,底層流和高層過濾流。 

而高層流不是從輸入裝置讀取,而是從其他流讀取。同樣高層輸出資料流也不是寫入輸出裝置,而是寫入其他流。 

使用"分層對象(layered objects)",為單個對象動態地,透明地添加功能的做法,被稱為Decorator Pattern。Decorator模式要求所有包覆在原始對象之外的對象,都必須具有與之完全相同的介面。這使得decorator的用法變得非常的透明--無論對象是否被decorate過,傳給它的訊息總是相同的。這也是Java I/O類庫要有"filter(過濾器)"類的原因:抽象的"filter"類是所有decorator的基類。Decorator模式常用於如下的情形:如果用繼承來解決各種需求的話,類的數量會多到不切實際的地步。Java的I/O類庫需要提供很多功能的組合,於是decorator模式就有了用武之地。 
 

 

DataInputStream類對象可以讀取各種類型的資料。 

DataOutputStream類對象可以寫各種類型的資料; 

建立這兩類對象時,必須使建立立的對象指向建構函式中的參數對象。例如: 

FileInputStream in=new FileInputStream("d:/abc.txt"); 

DataInputStream  din=new DataInputStream(in); 

7.2BufferInputStream和bufferOutputStream 

允許程式在不降低系統效能的情況下一次一個位元組的從流中讀取資料。 

BufferInputstream定義了兩種建構函式 

(1)       BufferInputStream  b= new BufferInputstream(in); 

(2)       BufferInputStream b=new BufferInputStream(in,size) 

  第二個參數表示指定緩衝器的大小。 

同樣BufferOutputStream也有兩種建構函式。一次一個位元組的向流中寫資料。 

7.3printstream 

用於寫入文本或基本類型 

兩種建構函式方法: 

PrintStream ps=new PrintStream(out); 

PrintStream ps=new PrintStream(out, autoflush) 

第二個參數為布爾值,控制每次輸出分行符號時java是否重新整理輸出資料流 

八.字元流的讀取和寫入 

java.io.Reader 和 java.io.InputStream 組成了 Java 輸入類。Reader 用於讀入16位字元,也就是 Unicode 編碼的字元;而 InputStream 用於讀入 ASCII 字元和位元據。 
Reader的體繫結構 
 

(1)       FileReader 

   FileReader 主要用來讀取字元檔案,使用預設的字元編碼,有三種建構函式: 

  --將檔案名稱作為字串 

   FileReader f=new FileReader(“c:/temp.txt”); 

--建構函式將File對象作為其參數。 

  File f=new file(“c:/temp.txt”); 

FileReader f1=new FileReader(f); 

--建構函式將FileDescriptor對象作為參數 

FileDescriptor() fd=new FileDescriptor() 

FileReader f2=new FileReader(fd); 

(2)    charArrayReader 

  將字元數組作為輸入資料流,建構函式為: 

public CharArrayReader(char[] ch); 

(3)    StringReader 

  讀取字串,建構函式如下: 

public StringReader(String s); 

(4)    InputStreamReader 

從輸入資料流讀取位元組,在將它們轉換成字元。 

Public inputstreamReader(inputstream is); 

(5)    FilterReader 

允許過濾字元流 

protected filterReader(Reader r); 

(6)    BufferReader 

  接受Reader對象作為參數,並對其添加字元緩衝器,使用readline()方法可以讀取一行。 

Public BufferReader(Reader r); 

Writer類體繫結構 
 
(1)       FileWrite 

   將字元類型資料寫入檔案,使用預設字元編碼和緩衝器大小。 

Public FileWrite(file f); 

(2)chararrayWrite() 

   將字元緩衝器用作輸出。 

  Public CharArrayWrite(); 

(3)    PrintWrite 

  產生格式化輸出 

public PrintWriter(outputstream os); 

(4)    filterWriter 

  用於寫入過濾字元流 

protected FilterWriter(Writer w); 
DataInputStream類對象可以讀取各種類型的資料。 

DataOutputStream類對象可以寫各種類型的資料; 

建立這兩類對象時,必須使建立立的對象指向建構函式中的參數對象。例如: 

FileInputStream in=new FileInputStream("d:/abc.txt"); 

DataInputStream  din=new DataInputStream(in); 

7.2BufferInputStream和bufferOutputStream 

允許程式在不降低系統效能的情況下一次一個位元組的從流中讀取資料。 

BufferInputstream定義了兩種建構函式 

(1)       BufferInputStream  b= new BufferInputstream(in); 

(2)       BufferInputStream b=new BufferInputStream(in,size) 

  第二個參數表示指定緩衝器的大小。 

同樣BufferOutputStream也有兩種建構函式。一次一個位元組的向流中寫資料。 

7.3printstream 

用於寫入文本或基本類型 

兩種建構函式方法: 

PrintStream ps=new PrintStream(out); 

PrintStream ps=new PrintStream(out, autoflush) 

第二個參數為布爾值,控制每次輸出分行符號

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.