1. 程式人生 > >InputStream使用read()方法 時,判斷尾標記許主意的問題

InputStream使用read()方法 時,判斷尾標記許主意的問題



先看下面一段程式碼:

[java] view plaincopyprint?
  1. //同過判斷檔案的結尾來讀取檔案
  2. import java.io.File;  
  3. import java.io.InputStream;  
  4. import java.io.FileInputStream;  
  5. publicclass InputStreamDemo02  
  6. {  
  7.     publicstaticvoid main(String args[]) throws Exception{  
  8.         File f = new File("E:"+File.separator+"java2"+File.separator+
    "StreamDemo"+File.separator+"test.txt");  
  9.         InputStream in = new FileInputStream(f);  
  10.         byte b[] = newbyte[1024];  
  11.         int len = 0;  
  12.         int temp=0;          //所有讀取的內容都使用temp接收
  13.         while((temp=in.read())!=-1){    //當沒有讀取完時,繼續讀取
  14.             b[len]=(byte)temp;  
  15.             len++;  
  16.         }  
  17.         in.close();  
  18.         System.out.println(new String(b,0,len));  
  19.     }  
  20. }  

執行結果為:Hello,java

在此程式碼中如果我不使用temp進行接收每次讀取的內容,而直接操作每次讀取的內容會怎麼樣呢?看下面的程式碼:

[java] view plaincopyprint?
  1. //同過判斷檔案的結尾來讀取檔案,不使用temp對讀取的每個位元組進行接收時,對比InputStreamDemo01.java
  2. import java.io.File;  
  3. import java.io.InputStream;  
  4. import java.io.FileInputStream;  
  5. publicclass InputStreamDemo03  
  6. {  
  7.     publicstaticvoid main(String args[]) throws Exception{  
  8.         File f = new File("E:"+File.separator+"java2"+File.separator+"StreamDemo"+File.separator+"test.txt");  
  9.         InputStream in = new FileInputStream(f);  
  10.         byte b[] = newbyte[1024];  
  11.         int len = 0;  
  12.         //int temp=0;
  13.         while((in.read())!=-1){    //當沒有讀取完時,繼續讀取
  14.             b[len]=(byte)in.read();       
  15.             len++;  
  16.         }  
  17.         System.out.println(new String(b,0,len));  
  18.     }  
  19. }  

執行結果為:el,aa

造成這一結果的原因是什麼?

觀察可以發現,執行結果是跳躍的,每一個內容與上一個內容都間隔了一個字元。再閱讀程式碼發現:in.read()被呼叫的兩次,所以原因也就出來了:原因是有兩次呼叫in.read(),in.read()是讀取下一位元組,導致b[]中儲存的是跳躍的,即每次存入其中的都與上一個內容相差一個位元組。問題並不複雜,重要的是自己書寫時可能會造成這樣的錯誤,所以一定要使用temp對讀取的內容進行接收,同時只操作temp。發現問題和解決問題時,細心耐心很重要。