BufferedInputStream類中的mark(int readlimit)方法

          對于BufferedInputStream類中的mark(int readlimit)方法的使用,很多人的疑惑是:參數readlimit究竟起什么作用?
          好象給readlimit賦任何整數值結果都是一樣。

           1 package io;
           2 
           3 import java.io.*;
           4 
           5 public class BufInputStrm_A {
           6 
           7     public static void main(String[] args) throws IOException {
           8         String s = "ABCDEFGHI@JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
           9         byte[] buf = s.getBytes();
          10         ByteArrayInputStream in = new ByteArrayInputStream(buf);
          11         BufferedInputStream bis = new BufferedInputStream(in, 13);
          12         int i = 0;
          13         int k;
          14         do {
          15             k = bis.read();
          16             System.out.print((char) k + " ");
          17             i++;
          18 
          19             if (i == 4) {
          20                 bis.mark(8);
          21             }
          22         } while (k != '@');
          23 
          24         System.out.println();
          25         
          26         bis.reset();
          27         k = bis.read();
          28         while (k != -1) {
          29 
          30             System.out.print((char) k + " ");
          31             k = bis.read();
          32         }
          33 
          34     }
          35 }
          36 

          備注:為了方便說明問題,我們假設要讀取的是一個字符串(第8行代碼),同時把緩存的大小設置為了13(第11行代碼)。
          在第20行代碼處調用了mark(int readlimit)方法,但無論給該方法傳-1、0、13、100程序輸出的結果都是一樣:

          A B C D E F G H I @ 
          E F G H I @ J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 

          在官方的API幫助文檔中,對于readlimit這個參數的解釋是:
              readlimit - the maximum limit of bytes that can be read before the mark position becomes invalid.
          其實,這里的最大字節數(the maximum limit of bytes)是指調用reset()方法之后,讀取超過readlimit指定的字節數,標記維(the mark position)會失效,如果這時再次調用reset()方法,會出現Resetting to invalid mark異常。例如下面的程序:

           1 package io;
           2 
           3 import java.io.*;
           4 
           5 public class BufInputStrm_A {
           6 
           7     public static void main(String[] args) throws IOException {
           8         String s = "ABCDEFGHI@JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
           9         byte[] buf = s.getBytes();
          10         ByteArrayInputStream in = new ByteArrayInputStream(buf);
          11         BufferedInputStream bis = new BufferedInputStream(in, 13);
          12         int i = 0;
          13         int k;
          14         do {
          15             k = bis.read();
          16             System.out.print((char) k + " ");
          17             i++;
          18 
          19             if (i == 4) {
          20                 bis.mark(8);
          21             }
          22         } while (k != '@');
          23 
          24         System.out.println();
          25 
          26         bis.reset();
          27         k = bis.read();
          28         while (k != -1) {
          29 
          30             System.out.print((char) k + " ");
          31             k = bis.read();
          32         }
          33 
          34         System.out.println();
          35 
          36         bis.reset();
          37         k = bis.read();
          38         while (k != -1) {
          39             System.out.print((char) k + " ");
          40             k = bis.read();
          41 
          42         }
          43 
          44     }
          45 }
          46 

          如果我們在第一次調用了reset()方法之后,控制讀入的字節不超過8個,程序就會正常執行,例如我們對上面的程序的26-32代碼用下面的代碼替換,程序就可以正常運行了。

                  bis.reset();
                  
          int j = 1;
                  k 
          = bis.read();
                  
          while (j < 9) {
                      
                      System.out.print((
          char) k + " ");
                      k 
          = bis.read();
                      j
          ++;
                  }

          補充:
              在mark(int readlimit)方法的代碼中,readlimit的值會賦給數據域marklimit,如果marklimit的值大于緩沖區的值BufferedInputStream會對緩沖區的大小進行調整,調整為marklimit的值。

           



          ----------------------------------
          把人做到寬容,把技術做到強悍。

          posted on 2008-04-24 14:45 OldBoy 閱讀(1461) 評論(5)  編輯  收藏 所屬分類: Java基礎

          評論

          # re: BufferedInputStream類中的mark(int readlimit)方法 2009-06-19 13:01 cloris

          謝謝分享,尤其是對于處在“較盲”階段的人,很受用。  回復  更多評論   

          # re: BufferedInputStream類中的mark(int readlimit)方法 2009-08-08 11:19 本娃娃

          import java.io.*;

          public class TestBufferStream {
          public static void main(String[] args) {
          try {
          FileInputStream fis = new FileInputStream("F:\\豬舍一角\\讀書筆記\\heihei.java");
          BufferedInputStream bis = new BufferedInputStream(fis);
          int c = 0;
          System.out.println(bis.read());
          System.out.println(bis.read());
          bis.mark(10);
          for(int i=0;i<200&&(c=bis.read())!=-1;i++) {
          System.out.print((char)c+"");
          }
          System.out.println();
          bis.reset();
          for(int i=0;i<200&&(c=bis.read())!=-1;i++) {
          System.out.print((char)c+"");
          }
          bis.close();
          } catch(IOException e) {
          e.printStackTrace();
          }
          }
          }


          你能幫我看看這段代碼嗎??還是不明白你的意思、、我自己再查查、、
          謝謝了!!(mark的參數怎么變都可以、、沒影響、、不明白、、)  回復  更多評論   

          # re: BufferedInputStream類中的mark(int readlimit)方法 2009-12-11 18:41 mixthm

          謝謝你的解釋,不過似乎說mark代表最大的字節數,有些問題
          如果在你的第2個代碼部分中,將第一次的reset操作后,限制讀取的次數,
          如while(k!=-1 && i++<12),第二次reset操作,讀取正常,但是如果是
          while(k!=-1 && i++<13),就會出現Resetting to invalid mark異常。
          我懷疑這里mark沒有實際的作用,操作還是取決于緩存區的大小  回復  更多評論   

          # re: BufferedInputStream類中的mark(int readlimit)方法 2009-12-11 18:51 mixthm

          按照你的解釋,第一次調用reset()后,如果超過readlimit設定的字節數后,就會出錯,可是只要從reset的坐標位置開始,沒有超過緩存大小,第二次讀取依舊正常。  回復  更多評論   

          # re: BufferedInputStream類中的mark(int readlimit)方法 2011-01-10 14:57 wofacha

          @mixthm
          mixthm的解釋是正確的。mark后讀多少字節失效,是取readlimit和BufferedInputStream緩沖區兩者的最大值。在這個例子中,readlimit是8字節,緩沖區是13字節,因此在mark后讀13個字節標記才會失效,而不是8字節后。
          是從mark以后算起,不是從reset以后。  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2009年12月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 沿河| 景泰县| 颍上县| 马公市| 江山市| 弥勒县| 新宁县| 永胜县| 抚顺县| 甘洛县| 密云县| 洛阳市| 项城市| 通城县| 沾益县| 自贡市| 榕江县| 富裕县| 霍林郭勒市| 南充市| 南丹县| 乐陵市| 松溪县| 洛浦县| 和政县| 阆中市| 彰武县| 通州市| 大方县| 清流县| 清水河县| 勐海县| 鹿泉市| 渝中区| 汉沽区| 淮南市| 库尔勒市| 长汀县| 安庆市| 休宁县| 鄄城县|