1. 程式人生 > >理解java.io的類繼承關係

理解java.io的類繼承關係

  讓我們用一個例子來演示對檔案的輸入輸出(例7.1)。圖7.3中列出了這個例子的執行結果。
  例7.1 fileIODemo.java。
  1:import java.io.*;
  2:import java.lang.*;
  3:
  4: public class fileIODemo{
  5:  public static void main(String args[]){
  6:   try{
     //建立輸入輸出流
  7:   FileInputStream inStream = new FileInputStream("text.src");
  8:   FileOutputStream outStream = new FileOutputStream("text.des");
      //讀文並寫入輸出流
  9:     boolean eof = false;
  10:    while(!eof){
  11:     int c = inStream.read();
  12:     if(c==-1) eof = true;
  13:     outStream.write((char)c);
  14:    }
  15:    inStream.close();
  16:    outStream.close();
  17:   }catch(FileNotFoundException ex){
  18:    System.out.println("Error finding the files");
  19:   }catch(IOException ex){
  20:   System.out.println("IOException occured.");
  21:  }
    //獲取檔案管理資訊
  22:  File file = new File("text.des");
  23:  System.out.println("Parent Directory:"+file.getParent());
  24:  System.out.println("Path:"+file.getPath());
  25:  System.out.println("File Name:"+file.getName());
  26:  try{
     //建立RandomAccessFile物件,以便隨機讀寫。"rw"代表可讀可寫
  27:   RandomAccessFile rafile = new RandomAccessFile("text.des","rw");
     //指標置到檔案頭
  28:   rafile.seek(0);
  29:   boolean eof=false;
  30:   System.out.println("The content from very head:");
     //讀檔案
  31:   while(!eof){
  32:   int c = rafile.read();
  33:    if(c==-1) eof = true;
  34:    else System.out.print((char)c);
  35:   }
     //下兩行把讀指標置到第三位元組
  36:   rafile.seek(0);
  37:   rafile.skipBytes(3);
  38:   System.out.println("\nThe pointer's position:"+rafile.getFilePointer());
  39:   System.out.println("The content from current position:");
  40:   eof=false;
  41:   while(!eof){
  42:    int c=rafile.read();
  43:    if(c==-1) eof=true;
  44:    else System.out.print((char)c);
  45:   }
     //強制輸出緩衝區中所有內容
  46:   System.out.flush();
  47:   rafile.close();
  48:  }catch(IOException ex){
  49:   System.out.println("RandomAccessFile cause IOException!");
  50:  }
  51: }
  52:}
  例7.1的執行結果如下:
  (略)
  為了充分展示與檔案I/O相關的類的作用,我們的例子中有一些冗餘的東西。我們的這個程式位於C:\BookDemo\ch07路徑下(見例7.1行 7),此路徑又有一個子上當text,其中有檔案text.src。執行此程式,將在C:\bookDemo\ch07下建立一個新檔案 text.des,text.src的內容被寫信此檔案。下面的段對File類的演示說明了檔案的部分管理資訊。然後我們又使用了 RandomAccessFile,試驗了檔案在指定位置的讀寫。
  第46行的Sytem.out.flush()語句不可以被省略,讀者不妨去掉它試一試。你會發現,有一部分輸出資訊不知道到哪兒去了。實際上,flush()的作用就是把緩衝區中的資料全部輸出,我們棣輸出流輸出以後,某些輸出流(有緩衝區的流)只是把資料寫進了緩衝區而已,不會馬上寫到我們要求的目的地。如果不像例子中一樣強制輸出,部分資料可以就來不及在程式結束前輸出了。
  細心的讀者或許要問:為什麼第一次用ReadomAccessFile讀檔案時,輸出語句後面沒有flush()呢?豈非自相矛盾嗎?原來, System.out是PrintStream類的物件(關於PrintStream後有緩衝區中的內容清除出去。因此許多地方就不必加flush() 了。PrintStream的這個特點,在建立其物件時是可以去掉(disable)的。
  這個程式中用到了IOException和FileNotFoundException兩個異常。後者是從前者派生出來的,因此,如果去年程式中的所有try、catch,而在main()方法開頭加上throws IOException,哪樣可以。但這樣不好區分各種不同的異常情況,即使找不到我們需要的text.src檔案,也不會有任何資訊顯示。這無疑是一種不良的程式設計風格。因此我們提倡對各個異常分別處理,這樣對出錯情況可以很地掌握。