InputStream使用read()方法 時,判斷尾標記許主意的問題
阿新 • • 發佈:2019-02-08
先看下面一段程式碼:
[java] view plaincopyprint?- //同過判斷檔案的結尾來讀取檔案
- import java.io.File;
- import java.io.InputStream;
- import java.io.FileInputStream;
- publicclass InputStreamDemo02
- {
- publicstaticvoid main(String args[]) throws Exception{
- File f = new File("E:"+File.separator+"java2"+File.separator+
- InputStream in = new FileInputStream(f);
- byte b[] = newbyte[1024];
- int len = 0;
- int temp=0; //所有讀取的內容都使用temp接收
- while((temp=in.read())!=-1){ //當沒有讀取完時,繼續讀取
- b[len]=(byte)temp;
- len++;
- }
- in.close();
- System.out.println(new String(b,0,len));
- }
- }
執行結果為:Hello,java
在此程式碼中如果我不使用temp進行接收每次讀取的內容,而直接操作每次讀取的內容會怎麼樣呢?看下面的程式碼:
[java] view plaincopyprint?- //同過判斷檔案的結尾來讀取檔案,不使用temp對讀取的每個位元組進行接收時,對比InputStreamDemo01.java
- import java.io.File;
- import java.io.InputStream;
- import java.io.FileInputStream;
- publicclass InputStreamDemo03
- {
- publicstaticvoid main(String args[]) throws Exception{
- File f = new File("E:"+File.separator+"java2"+File.separator+"StreamDemo"+File.separator+"test.txt");
- InputStream in = new FileInputStream(f);
- byte b[] = newbyte[1024];
- int len = 0;
- //int temp=0;
- while((in.read())!=-1){ //當沒有讀取完時,繼續讀取
- b[len]=(byte)in.read();
- len++;
- }
- System.out.println(new String(b,0,len));
- }
- }
執行結果為:el,aa
造成這一結果的原因是什麼?
觀察可以發現,執行結果是跳躍的,每一個內容與上一個內容都間隔了一個字元。再閱讀程式碼發現:in.read()被呼叫的兩次,所以原因也就出來了:原因是有兩次呼叫in.read(),in.read()是讀取下一位元組,導致b[]中儲存的是跳躍的,即每次存入其中的都與上一個內容相差一個位元組。問題並不複雜,重要的是自己書寫時可能會造成這樣的錯誤,所以一定要使用temp對讀取的內容進行接收,同時只操作temp。發現問題和解決問題時,細心耐心很重要。