为什么在in.mark(0)之后读取字符不会使标记无效

时间:2014-05-22 15:42:02

标签: java io reset

我从问题中了解到:What are mark and reset in BufferedReader?标记函数的参数将限制标记后可以读取的字符数。

如果参数为0,那么是否表示标记(0)后的任何读取都会使标记无效?为什么reset()仍然有效?

同样,我得到了一个将此参数设置为不同数字50的示例,并报告IOException:Mark invalid。 http://www.coderanch.com/t/426468/java-io/java/Mark-reset-inputstream

所以我自己就写了一个例子。但是,readlimite参数似乎无论如何都不起作用。这是我的程序

 import java.io.BufferedInputStream;
 import java.io.FileInputStream;
 import java.io.FilterInputStream;
 import java.io.InputStream;
 public class TestMarkReset {
 public static void main(String[] args) throws Exception {
                // create input streams
        InputStream is = new FileInputStream("/home/peipei/test.txt");
        FilterInputStream fis = new BufferedInputStream(is);

        // reads and prints BufferedReader
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());

        // mark invoked at this position
        fis.mark(1);
        System.out.println("mark() invoked");
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());
        // reset() repositioned the stream to the mark
        fis.reset();
        System.out.println("reset() invoked");
        System.out.println((char) fis.read());
        System.out.println((char) fis.read());

      }

}

有谁能解释一下这个参数发生了什么?为什么有时它会起作用,有时它不起作用?

1 个答案:

答案 0 :(得分:0)

您应该说标记后的任何读取<0> 可以使标记无效吗?

唯一的问题是;是你在缓冲区中标记的点?如果是,你仍然可以重置()它。如果没有,你不能因为它已经丢失了。

缓冲区在读取时一次删除一个字节会非常昂贵。当您需要从操作系统中读取更多数据时,它只会清除缓冲区。