原來BufferedReader不能和InputStream交替使用(轉)
Posted on 2007-08-03 01:23 leekiang 閱讀(9329) 評論(1) 編輯 收藏 所屬分類: java最近寫代碼時發現用BufferedReader把InputStream包裝后,使用BufferedReader讀取后,然后再使用 InputStream讀取時總是發現問題,好像總是丟數據,由于我在流里面同時混了二進制數據與字符串,所以很不好調度,然后專門寫了下面的代碼去測試發現原來是. BufferedReader讀取數據時會把數據從流里面取出一部分緩存,如果你再轉向去用InputStream去讀取的話,BufferedReader緩存里面的數據InputStream是讀取不到的 .
package bytearray;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class TestByteArray {
public byte[] generateByte() {
// 構造一個測試流,這樣就不用從文件里面讀取了,在這個流里面使用了大量的回車換行("\r\n"),這樣方便過會的測試
// 過會,我會通過把字符串轉換成byte數組,然后通過ByteArrayInputStream來構造一個數據流
return "a\r\nbc\r\ndef\r\nghi\r\nj\r\nklmn\r\nopqr\r\ns\r\ntuvwxyz "
.getBytes();
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
TestByteArray self = new TestByteArray();
byte[] be = self.generateByte();
InputStream in = new ByteArrayInputStream(be);
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(
in));
// 使用DataInputStream而不直接使用Inputstream是因為這樣方便,因為他提供了讀取行
// 不過聽說他讀取行時把字節轉變為字符時會有問題,所以不推薦使用,不過我們在這只做測試就沒關系了
DataInputStream dataInputStream = new DataInputStream(in);
// 先讀取流里面的一行數據
System.out.println("bufferReader=" + bufferReader.readLine());
// 回過頭來使用dataInputStream讀取數據,會發現什么也讀取不到
System.out.println("dataInputStream=" + dataInputStream.readLine());
// 回過頭來使用inputstream讀取數據,會發現什么也讀取不到
System.out.println("in=" + in.read());
// InputStream讀取不到數據,然后再使用原來的BufferedReader來讀取數據,發現是接著原來讀取的.
System.out.println("bufferReader=" + bufferReader.readLine());
//我們上面的字符串比較小,我想如果字符串,大到緩存裝不下的時候,使用inputstream回頭去讀取數據,肯定是能讀取到的
//這個我就不測試了
}
}
轉自 http://itspy.spaces.live.com/blog/cns!87AF3B24336DF461!180.entry
package bytearray;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class TestByteArray {
public byte[] generateByte() {
// 構造一個測試流,這樣就不用從文件里面讀取了,在這個流里面使用了大量的回車換行("\r\n"),這樣方便過會的測試
// 過會,我會通過把字符串轉換成byte數組,然后通過ByteArrayInputStream來構造一個數據流
return "a\r\nbc\r\ndef\r\nghi\r\nj\r\nklmn\r\nopqr\r\ns\r\ntuvwxyz "
.getBytes();
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
TestByteArray self = new TestByteArray();
byte[] be = self.generateByte();
InputStream in = new ByteArrayInputStream(be);
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(
in));
// 使用DataInputStream而不直接使用Inputstream是因為這樣方便,因為他提供了讀取行
// 不過聽說他讀取行時把字節轉變為字符時會有問題,所以不推薦使用,不過我們在這只做測試就沒關系了
DataInputStream dataInputStream = new DataInputStream(in);
// 先讀取流里面的一行數據
System.out.println("bufferReader=" + bufferReader.readLine());
// 回過頭來使用dataInputStream讀取數據,會發現什么也讀取不到
System.out.println("dataInputStream=" + dataInputStream.readLine());
// 回過頭來使用inputstream讀取數據,會發現什么也讀取不到
System.out.println("in=" + in.read());
// InputStream讀取不到數據,然后再使用原來的BufferedReader來讀取數據,發現是接著原來讀取的.
System.out.println("bufferReader=" + bufferReader.readLine());
//我們上面的字符串比較小,我想如果字符串,大到緩存裝不下的時候,使用inputstream回頭去讀取數據,肯定是能讀取到的
//這個我就不測試了
}
}
轉自 http://itspy.spaces.live.com/blog/cns!87AF3B24336DF461!180.entry