理解java.io的類繼承關係
阿新 • • 發佈:2019-01-31
讓我們用一個例子來演示對檔案的輸入輸出(例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檔案,也不會有任何資訊顯示。這無疑是一種不良的程式設計風格。因此我們提倡對各個異常分別處理,這樣對出錯情況可以很地掌握。
例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檔案,也不會有任何資訊顯示。這無疑是一種不良的程式設計風格。因此我們提倡對各個異常分別處理,這樣對出錯情況可以很地掌握。