原來(lái)BufferedReader不能和InputStream交替使用(轉(zhuǎn))
Posted on 2007-08-03 01:23 leekiang 閱讀(9337) 評(píng)論(1) 編輯 收藏 所屬分類: java最近寫代碼時(shí)發(fā)現(xiàn)用BufferedReader把InputStream包裝后,使用BufferedReader讀取后,然后再使用 InputStream讀取時(shí)總是發(fā)現(xiàn)問(wèn)題,好像總是丟數(shù)據(jù),由于我在流里面同時(shí)混了二進(jìn)制數(shù)據(jù)與字符串,所以很不好調(diào)度,然后專門寫了下面的代碼去測(cè)試發(fā)現(xiàn)原來(lái)是. BufferedReader讀取數(shù)據(jù)時(shí)會(huì)把數(shù)據(jù)從流里面取出一部分緩存,如果你再轉(zhuǎn)向去用InputStream去讀取的話,BufferedReader緩存里面的數(shù)據(jù)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() {
// 構(gòu)造一個(gè)測(cè)試流,這樣就不用從文件里面讀取了,在這個(gè)流里面使用了大量的回車換行("\r\n"),這樣方便過(guò)會(huì)的測(cè)試
// 過(guò)會(huì),我會(huì)通過(guò)把字符串轉(zhuǎn)換成byte數(shù)組,然后通過(guò)ByteArrayInputStream來(lái)構(gòu)造一個(gè)數(shù)據(jù)流
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是因?yàn)檫@樣方便,因?yàn)樗峁┝俗x取行
// 不過(guò)聽(tīng)說(shuō)他讀取行時(shí)把字節(jié)轉(zhuǎn)變?yōu)樽址麜r(shí)會(huì)有問(wèn)題,所以不推薦使用,不過(guò)我們?cè)谶@只做測(cè)試就沒(méi)關(guān)系了
DataInputStream dataInputStream = new DataInputStream(in);
// 先讀取流里面的一行數(shù)據(jù)
System.out.println("bufferReader=" + bufferReader.readLine());
// 回過(guò)頭來(lái)使用dataInputStream讀取數(shù)據(jù),會(huì)發(fā)現(xiàn)什么也讀取不到
System.out.println("dataInputStream=" + dataInputStream.readLine());
// 回過(guò)頭來(lái)使用inputstream讀取數(shù)據(jù),會(huì)發(fā)現(xiàn)什么也讀取不到
System.out.println("in=" + in.read());
// InputStream讀取不到數(shù)據(jù),然后再使用原來(lái)的BufferedReader來(lái)讀取數(shù)據(jù),發(fā)現(xiàn)是接著原來(lái)讀取的.
System.out.println("bufferReader=" + bufferReader.readLine());
//我們上面的字符串比較小,我想如果字符串,大到緩存裝不下的時(shí)候,使用inputstream回頭去讀取數(shù)據(jù),肯定是能讀取到的
//這個(gè)我就不測(cè)試了
}
}
轉(zhuǎn)自 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() {
// 構(gòu)造一個(gè)測(cè)試流,這樣就不用從文件里面讀取了,在這個(gè)流里面使用了大量的回車換行("\r\n"),這樣方便過(guò)會(huì)的測(cè)試
// 過(guò)會(huì),我會(huì)通過(guò)把字符串轉(zhuǎn)換成byte數(shù)組,然后通過(guò)ByteArrayInputStream來(lái)構(gòu)造一個(gè)數(shù)據(jù)流
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是因?yàn)檫@樣方便,因?yàn)樗峁┝俗x取行
// 不過(guò)聽(tīng)說(shuō)他讀取行時(shí)把字節(jié)轉(zhuǎn)變?yōu)樽址麜r(shí)會(huì)有問(wèn)題,所以不推薦使用,不過(guò)我們?cè)谶@只做測(cè)試就沒(méi)關(guān)系了
DataInputStream dataInputStream = new DataInputStream(in);
// 先讀取流里面的一行數(shù)據(jù)
System.out.println("bufferReader=" + bufferReader.readLine());
// 回過(guò)頭來(lái)使用dataInputStream讀取數(shù)據(jù),會(huì)發(fā)現(xiàn)什么也讀取不到
System.out.println("dataInputStream=" + dataInputStream.readLine());
// 回過(guò)頭來(lái)使用inputstream讀取數(shù)據(jù),會(huì)發(fā)現(xiàn)什么也讀取不到
System.out.println("in=" + in.read());
// InputStream讀取不到數(shù)據(jù),然后再使用原來(lái)的BufferedReader來(lái)讀取數(shù)據(jù),發(fā)現(xiàn)是接著原來(lái)讀取的.
System.out.println("bufferReader=" + bufferReader.readLine());
//我們上面的字符串比較小,我想如果字符串,大到緩存裝不下的時(shí)候,使用inputstream回頭去讀取數(shù)據(jù),肯定是能讀取到的
//這個(gè)我就不測(cè)試了
}
}
轉(zhuǎn)自 http://itspy.spaces.live.com/blog/cns!87AF3B24336DF461!180.entry