java I/O流

【原文】http://blog.csdn.net/maninhill/archive/2005/06/10/391613.aspx

 

java I/O整體框架:

Java中的流分爲兩種,一種是字節流,另一種是字符流,分別由四個抽象類來表示(每種流包括輸入和輸出兩種所以一共四個):InputStream,OutputStream,Reader,Writer。

 

其中FilterInputStream ,FilterOutputStream,FilterReader,FillerWriter爲Decorator類,用來包裝.

OutpurtStraeamReader,InputStreamWriter是用來轉換字節流到字符流.

RandomAccessFile並不是從InputStream或OutputStream繼承過來.它只實現DataIput和DataOutput方法.

接口DataInput 中定義的方法主要包括從流中讀取基本類型的數據、讀取一行數據、或者讀取指定長度的字節數。如:readBoolean( )、readInt( )、readLine( )、readFully( ) 等。

 

接口DataOutput 中定義的方法主要是向流中寫入基本類型的數據、或者寫入一定長度的字節數組。如:writeChar( )、writeDouble( )、write( ) 等。

 

下面詳細介紹RandomAccessFile類中的方法。

 

 ◇ 構造方法:
  RandomAccessFile(String name,String mode); //name是文件名,mode
          //是打開方式,例如"r"表示只讀,"rw"表示可讀寫,"
  RandomAccessFile(File file,String mode); //file是文件對象

 

 ◇ 文件指針的操作
  long getFilePointer( ); //用於得到當前的文件指針
  void seek( long pos ); //用於移動文件指針到指定的位置
  int skipBytes( int n ); //使文件指針向前移動指定的n個字節


接口DataInput 中定義的方法主要包括從流中讀取基本類型的數據、讀取一行數據、或者讀取指定長度的字節數。如:readBoolean( )、readInt( )、readLine( )、readFully( ) 等。
  

例子:

 

 

Java提供了這樣一個功能,將標準的輸入輸出流轉向,也就是說,我們可以將某個其他的流設爲標準輸入或輸出流,看下面這個例子:

 


 


在這裏java.lang.System的靜態方法:

static void setIn(InputStream in)
static void setOut(PrintStream out) 


提供了重新定義標準輸入輸出流的方法,這樣做是很方便的,比如一個程序的結果有很多,有時候甚至要翻頁顯示,這樣不便於觀看結果,這是你就可以將標準輸出流定義爲一個文件流,程序運行完之後打開相應的文件觀看結果,就直觀了許多。

 

Java流有着另一個重要的用途,那就是利用對象流對對象進行序列化。下面將開始介紹這方面的問題。

 

在一個程序運行的時候,其中的變量數據是保存在內存中的,一旦程序結束這些數據將不會被保存,一種解決的辦法是將數據寫入文件,而Java中提供了一種機制,它可以將程序中的對象寫入文件,之後再從文件中把對象讀出來重新建立。這就是所謂的對象序列化Java中引入它主要是爲了RMI(Remote Method Invocation)和Java Bean所用,不過在平時應用中,它也是很有用的一種技術。

所有需要實現對象序列化的對象必須首先實現Serializable接口。下面看一個例子:

 

 


類Logon是一個記錄登錄信息的類,包括用戶名和密碼。首先它實現了接口Serializable,這就標誌着它可以被序列化。之後再main方法裏ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));新建一個對象輸出流包裝一個文件流,表示對象序列化的目的地是文件Logon.out。然後用方法writeObject開始寫入。想要還原的時候也很簡單ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));新建一個對象輸入流以文件流Logon.out爲參數,之後調用readObject方法就可以了。

需要說明一點,對象序列化有一個神奇之處就是,它建立了一張對象網,將當前要序列化的對象中所持有的引用指向的對象都包含起來一起寫入到文件,更爲奇妙的是,如果你一次序列化了好幾個對象,它們中相同的內容將會被共享寫入。這的確是一個非常好的機制。它可以用來實現深層拷貝,有關深層拷貝的問題在JavaWorld上有一篇文章做了幾種實現方法的介紹和比較,有興趣者可以去看看。

 

關鍵字transient在這裏表示當前內容將不被序列化,比如例子中的密碼,需要保密,所以沒有被寫入文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章