熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java輸入輸出流詳解

2013-11-23 19:00:29  來源: Java核心技術 

  stream代表的是任何有能力產出數據的數據源或是任何有能力接收數據的接收源在Java的IO中所有的stream(包括Inputstream和Out stream)都包括兩種類型

  ()字節流

  表示以字節為單位從stream中讀取或往stream中寫入信息即io包中的inputstream類和outputstream類的派生類通常用來讀取二進制數據如圖象和聲音

  ()字符流

  以Unicode字符為導向的stream表示以Unicode字符為單位從stream中讀取或往stream中寫入信息

  區別

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

  但是Read和Write並不是取代InputStream和OutputStream有時你還必須同時使用基於byte的類基於字符的類為此它還提供了兩個適配器(adapter)InputStreamReader負責將InputStream轉化成Reader而OutputStreamWriter則將OutputStream轉化成Writer

  一.流的層次結構

  定義

  ()       java將讀取數據對象成為輸入流能向其寫入的對象叫輸出流結構圖如下

  

  輸入流

  

  輸出流

  二.InputStream類

  inputstream類和outputstream類都為抽象類不能創建對象可以通過子類來實例化

  InputStream是輸入字節數據用的類所以InputStream類提供了種重載的read方法Inputstream類中的常用方法

  ()       public abstract int read( )讀取一個byte的數據返回值是高位補的int類型值

  ()       public int read(byte b[ ])讀取blength個字節的數據放到b數組中返回值是讀取的字節數該方法實際上是調用下一個方法實現的

  ()       public int read(byte b[ ] int off int len)從輸入流中最多讀取len個字節的數據存放到偏移量為off的b數組中

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

  ()       public long skip(long n)忽略輸入流中的n個字節返回值是實際忽略的字節數 跳過一些字節來讀取

  ()       public int close( ) 我們在使用完後必須對我們打開的流進行關閉

  三.OutputStream類

  OutputStream提供了個write方法來做數據的輸出這個是和InputStream是相對應的

   public void write(byte b[ ])將參數b中的字節寫到輸出流

   public void write(byte b[ ] int off int len) 將參數b的從偏移量off開始的len個字節寫到輸出流

   public abstract void write(int b) 先將int轉換為byte類型把低字節寫入到輸出流中

   public void flush( ) : 將數據緩沖區中數據全部輸出並清空緩沖區

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

  注意

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

   InputStream和OutputStream都是抽象類不能創建這種類型的對象

  四.FileInputStream類

  FileInputStream類是InputStream類的子類用來處理以文件作為數據輸入源的數據流使用方法

  方式

  File fin=new File(d:/abctxt);

  FileInputStream in=new FileInputStream(fin);

  方式

  FileInputStream in=new

  FileInputStream(d: /abctxt);

  方式

  構造函數將 FileDescriptor()對象作為其參數

  FileDescriptor() fd=new FileDescriptor();

  FileInputStream f=new FileInputStream(fd);

  五.FileOutputStream類

  FileOutputStream類用來處理以文件作為數據輸出目的數據流一個表示文件名的字符串也可以是File或FileDescriptor對象

  創建一個文件流對象有兩種方法

  方式

  File f=new File(d:/abctxt);

  FileOutputStream out=new FileOutputStream (f);

  方式

  FileOutputStream out=new

  FileOutputStream(d:/abctxt);

  方式構造函數將 FileDescriptor()對象作為其參數

  FileDescriptor() fd=new FileDescriptor();

  FileOutputStream f=new FileOutputStream(fd);

  方式構造函數將文件名作為其第一參數將布爾值作為第二參數

  FileOutputStream f=new FileOutputStream(d:/abctxttrue);

  注意

  ()文件中寫數據時若文件已經存在則覆蓋存在的文件)的讀/寫操作結束時應調用close方法關閉流

  舉例

  六.File類

  File類與InputStream / OutputStream類同屬於一個包它不允許訪問文件內容

  File類主要用於命名文件查詢文件屬性和處理文件目錄

  舉例

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

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

  而高層流不是從輸入設備讀取而是從其他流讀取同樣高層輸出流也不是寫入輸出設備而是寫入其他流

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

  為InputStream和OutputStream定義decorator類接口的類分別是FilterInputStream和FilterOutputStream

  

  FilterInputStream的種類

  構造函數的參數

  DataInputStream

  與DataOutputStream配合使用這樣你就能以一種可攜帶的方式(portable fashion)從流裡讀取primitives了(intcharlong等)

  InputStream

  包含了一整套讀取primitive數據的接口

  BufferedInputStream

  用這個類來解決每次要用數據的時候都要進行物理讀取的問題你的意思是用緩沖區

  InputStream以及可選的緩沖區的容量

  它本身並不提供接口只是提供一個緩沖區需要連到一個有接口的對象(interface object)

  LineNumberInputStream

  跟蹤輸入流的行號有getLineNumber( )和setLineNumber(int)方法

  InputStream

  只是加一個行號所以還得連一個有接口的對象

  PushbackInputStream

  有一個彈壓單字節的緩沖區(has a one byte pushback buffer)這樣你就能把最後讀到的那個字節再壓回去了

  InputStream

  主要用於編譯器的掃描程序可能是為支持Java的編譯器而設計的用的機會不多

  

  FilterOutputStream的種類

  構造函數的參數

  DataOutputStream

  與DataInputStream配合使用這樣你就可以用一種可攜帶的方式(portable fashion)往流裡寫primitive了(int char long等)

  OutputStream

  包括寫入primitive數據的全套接口

  PrintStream

  負責生成帶格式的輸出(formatted output)DataOutputStrem負責數據的存儲而PrintStream負責數據的顯示

  一個OutputStream以及一個可選的boolean值這個boolean值表示要不要清空換行符後面的緩沖區

  應該是OutputStream對象的最終包覆層用的機會很多

  BufferedOutputStream

  用 這個類解決每次往流裡寫數據都要進行物理操作的問題也就是說用緩沖區用flush( )清空緩沖區

  OutputStream 以及一個可選的緩沖區大小

  本身並不提供接口只是加了一個緩沖區需要鏈接一個有接口的對象

  DataInputStream類對象可以讀取各種類型的數據

  DataOutputStream類對象可以寫各種類型的數據

  創建這兩類對象時必須使新建立的對象指向構造函數中的參數對象例如

  FileInputStream in=new FileInputStream(d:/abctxt);

  DataInputStream din=new DataInputStream(in);

  BufferInputStream和bufferOutputStream

  允許程序在不降低系統性能的情況下一次一個字節的從流中讀取數據

  BufferInputstream定義了兩種構造函數

  ()       BufferInputStream b= new BufferInputstream(in);

  ()       BufferInputStream b=new BufferInputStream(insize)

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

  同樣BufferOutputStream也有兩種構造函數一次一個字節的向流中寫數據

  printstream

  用於寫入文本或基本類型

  兩種構造函數方法

  PrintStream ps=new PrintStream(out);

  PrintStream ps=new PrintStream(out autoflush)

  第二個參數為布爾值控制每次輸出換行符時java是否刷新輸出流

  八.字符流的讀取和寫入

  javaioReader 和 javaioInputStream 組成了 Java 輸入類Reader 用於讀入位字符也就是 Unicode 編碼的字符而 InputStream 用於讀入 ASCII 字符和二進制數據

  
Reader的體系結構

  ()       FileReader

  FileReader主要用來讀取字符文件使用缺省的字符編碼有三種構造函數

  將文件名作為字符串

  FileReader f=new FileReader(c:/temptxt);

  構造函數將File對象作為其參數

  File f=new file(c:/temptxt);

  FileReader f=new FileReader(f);

  構造函數將FileDescriptor對象作為參數

  FileDescriptor() fd=new FileDescriptor()

  FileReader f=new FileReader(fd);

  ()    charArrayReader

  將字符數組作為輸入流構造函數為

  public CharArrayReader(char[] ch);

  ()    StringReader

  讀取字符串構造函數如下

  public StringReader(String s);

  ()    InputStreamReader

  從輸入流讀取字節在將它們轉換成字符

  Public inputstreamReader(inputstream is);

  ()    FilterReader

  允許過濾字符流

  protected filterReader(Reader r);

  ()    BufferReader

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

  Public BufferReader(Reader r);

  
Writer類體系結構

  ()       FileWrite

  將字符類型數據寫入文件使用缺省字符編碼和緩沖器大小

  Public FileWrite(file f);

  ()chararrayWrite()

  將字符緩沖器用作輸出

  Public CharArrayWrite();

  ()    PrintWrite

  生成格式化輸出

  public PrintWriter(outputstream os);

  ()    filterWriter

  用於寫入過濾字符流

  protected FilterWriter(Writer w);

  

  FilterOutputStream的種類

  構造函數的參數

  DataOutputStream

  與DataInputStream配合使用這樣你就可以用一種可攜帶的方式(portable fashion)往流裡寫primitive了(int char long等)

  OutputStream

  包括寫入primitive數據的全套接口

  PrintStream

  負責生成帶格式的輸出(formatted output)DataOutputStrem負責數據的存儲而PrintStream負責數據的顯示

  一個OutputStream以及一個可選的boolean值這個boolean值表示要不要清空換行符後面的緩沖區

  應該是OutputStream對象的最終包覆層用的機會很多

  BufferedOutputStream

  用 這個類解決每次往流裡寫數據都要進行物理操作的問題也就是說用緩沖區用flush( )清空緩沖區

  OutputStream 以及一個可選的緩沖區大小

  本身並不提供接口只是加了一個緩沖區需要鏈接一個有接口的對象

  DataInputStream類對象可以讀取各種類型的數據

  DataOutputStream類對象可以寫各種類型的數據

  創建這兩類對象時必須使新建立的對象指向構造函數中的參數對象例如

  FileInputStream in=new FileInputStream(d:/abctxt);

  DataInputStream din=new DataInputStream(in);

  BufferInputStream和bufferOutputStream

  允許程序在不降低系統性能的情況下一次一個字節的從流中讀取數據

  BufferInputstream定義了兩種構造函數

  ()       BufferInputStream b= new BufferInputstream(in);

  ()       BufferInputStream b=new BufferInputStream(insize)

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

  同樣BufferOutputStream也有兩種構造函數一次一個字節的向流中寫數據

  printstream

  用於寫入文本或基本類型

  兩種構造函數方法

  PrintStream ps=new PrintStream(out);

  PrintStream ps=new PrintStream(out autoflush)

  第二個參數為布爾值控制每次輸出換行符時java是否刷新輸出流


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26122.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.