Java提高篇(二):IO位元組流、字元流和處理流

geeksongs發表於2018-10-22

在我們的Java語言當中,通常會有對檔案進行讀寫,因此我們引入java的IO類來進行檔案的讀寫。

一.位元組流

下面是一個位元組流的例項:

 1 import java.io.*;
 2 public class IO {
 3     public static void main(String[] args) {
 4         System.out.println("現在利用Java的一個類讀取一個資料已經定義好的資料");
 5         FileInputStream fis=null;//利用這個函式寫進來的是位元組型讀入而非字元型
 6         FileOutputStream fos=null;//這個類是我們引入的IO包當中的類了,首先進行物件和引用變數的建立,後面使用了丟擲異常的操作是為了讓機器避免發生出錯。
 7         try
 8         {
 9             fis=new FileInputStream("F:/我自己編寫的程式碼庫/JAVA/src/from.txt");//後面引入引數,說明讀取的檔案的絕對路徑,絕對路徑裡面有中文都居然成功了。
10             fos =new FileOutputStream("F:/我自己編寫的程式碼庫/JAVA/src/fromto.txt");
11             byte buffer[]=new byte[100];//這裡定義位元二進位制的陣列,證明了我們使用的是位元組型流,而不是字元型,字元型利用了其它的定義
12             int temp=fis.read(buffer,0,100);//第一:輸入進來的必須是位元陣列流。第二:開始進行輸入的位元序列號,如第一個,第二個。第三:輸入流的位元長度
13             for (int i=0;i<=99;i++)
14             {
15                 System.out.println(buffer[i]);
16             }
17             fos.write(buffer,0,temp);//temp變數reveal了讀入資料所接收到的位元組的長度,這個正好是read函式的返回值
18         }
19         catch (Exception e)
20         {
21             System.out.println(e);//在改變了我們的讀取陣列長度之後,讀取成功了,之前在for迴圈的地方越界了
22         }
23     }
24 
25 }

如果想讀入一篇具有多個文字的檔案的話,可以使用以下程式碼:

 1    import java.io.*;
 2 
 3 public class IO2 {
 4     public static void main(String[] args) {
 5         System.out.println("現在進行大型檔案的讀寫");
 6         FileInputStream fis1=null;
 7         FileOutputStream fos1=null;
 8         try
 9         {
10            fis1=new FileInputStream("F:/我自己編寫的程式碼庫/JAVA/src/from1.txt");
11            fos1=new FileOutputStream("F:/我自己編寫的程式碼庫/JAVA/src/fromto1.txt");
12            byte buffer[]=new byte[1024];
13            while(true)
14            {
15                 int temp=fis1.read(buffer,0,buffer.length);//read方法返回的是每次讀取檔案的位元組數(比如a的asc碼等)
16                 if(temp==-1)//假設讀到1024位元組了,或者在1024位元組之前就沒有位元組可讀了,就會返回-1這個數值,然後跳出該迴圈,進行下一個迴圈
17                 {
18                     break;//這個程式在進行下一個迴圈的進入點在哪裡呢?並沒有提到,按道理來說是不會從剛剛已經讀過的資料開始讀,應該裡面有一種自動讀取的機制
19                 }
20                 fos1.write(buffer,0,buffer.length);
21            }
22         }
23         catch (Exception e)
24         {
25             System.out.println(e);
26         }
27         finally {
28             try{
29                 fis1.close();
30                 fos1.close();//在這裡進行IO流的關閉,有開就有關,不然的話就會造成資源的浪費
31                 System.out.println("讀寫完畢");
32             }
33             catch (Exception e)
34             {
35                 System.out.println(e);
36             }
37         }
38     }}

 

注意前面建立物件的時候,我們建立的陣列具有1024個位元組,這是因為我們常常通過1024個位元組進行讀取,1024個位元組正好等於了1個K,這樣才可以對大檔案當中的文字進行讀寫。最後我們在finally處,關閉了這個流,如果不關閉這個流的話,檔案寫入進去之後,是不會被儲存下來的。

二.字元流

示例程式碼如下:

 

 1 mport java.io.*;
 2 public class IO3 {
 3     public static void main(String[] args) {
 4         System.out.println("現在開始字元流型程式的編寫");
 5         FileReader fis2=null;
 6         FileWriter fos2=null;
 7         try {
 8             fis2=new FileReader("F:/我自己編寫的程式碼庫/JAVA/src/from2.txt");
 9             fos2=new FileWriter("F:/我自己編寫的程式碼庫/JAVA/src/fromto2.txt");
10             char buffer[]=new char[100];//字元流和位元組流的區別就是這裡,引入的物件buffer是字元型定義的是字元而不是二進位制了。以及前面建立的兩個物件分別是:   FileReader和FileWriter。這就是兩個不同的區別,其它的完全相同。
11             int temp=fis2.read(buffer,0,buffer.length);
12             for(int i=0;i<=99;i++)
13             {
14                 System.out.println(buffer[i]);
15             }
16             fos2.write(buffer,0,buffer.length);
17             System.out.println("完成輸入以及輸出");
18         }
19         catch (Exception e)
20         {
21             System.out.println(e);
22         }
23         finally {
24             try{
25                 fis2.close();
26                 fos2.close();//只有關閉了輸入輸出流之後,輸入進去的位元組才會儲存,不關閉的話,就僅僅會停留在記憶體當中不會儲存的。這就是需要關閉的原因了。
27             }
28             catch (Exception e)
29             {
30                 System.out.println(e);
31             }
32         }
33     }
34 }

 

讀取大型檔案的程式碼只需要根據和位元組流進行相似的處理就可以進行讀取大型檔案了。

三.處理流

例項程式碼如下:

 

 1 import java.io.*;
 2 public class IO4 {
 3     public static void main(String[] args) {
 4         System.out.println("現在開始處理流程式的書寫
");
 5         FileReader a=null;
 6         BufferedReader b=null;
 7         try
 8         {
 9             String line=null;
10             a=new FileReader("F:/我自己編寫的程式碼庫/JAVA/src/from2.txt");
11             b=new BufferedReader(a);
12             while(true)
13             {
14                 line=b.readLine();
15                 if(line==null)
16                 {
17                     break;
18                 }
19                 System.out.println(line);//這裡列印出了我們讀取檔案的內容,至於裡面的內容為什麼會像像這樣列印,明天再來講解。
20             }
21         }
22         catch (Exception e)
23         {
24             System.out.println(e);
25         }
26     }
27 }

 

上述程式碼還是比較容易理解的。

 


相關文章