MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          最近寫代碼時(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

          評(píng)論

          # re: 原來(lái)BufferedReader不能和InputStream交替使用(轉(zhuǎn))[未登錄](méi)  回復(fù)  更多評(píng)論   

          2011-11-13 11:00 by Java學(xué)習(xí)者
          那如何解決上面的內(nèi)容呢
          BufferedReader br = new BufferedReader(new InputStreamReader(
          System.in);
          int read=13;
          while((read=br.read())!=13)在測(cè)試運(yùn)行時(shí)會(huì)出現(xiàn)int不能轉(zhuǎn)換Boolean
          請(qǐng)問(wèn)如何解決
          主站蜘蛛池模板: 溆浦县| 苗栗市| 南城县| 乌鲁木齐县| 浦江县| 屏东县| 陈巴尔虎旗| 马公市| 佳木斯市| 恩平市| 芮城县| 新巴尔虎右旗| 香河县| 抚顺市| 黎城县| 涿州市| 淅川县| 盐亭县| 郸城县| 扶绥县| 凤台县| 天台县| 天水市| 高清| 蒙山县| 芜湖市| 昌黎县| 南召县| 鄂尔多斯市| 稷山县| 茂名市| 肥乡县| 庐江县| 宁强县| 长宁区| 南平市| 凤凰县| 石林| 五寨县| 池州市| 来安县|