应该很简单:我有一个InputStream,我想要查看(不读取)前两个字节,即我希望在我偷看后,InputStream的"当前位置"为0.什么是最好最安全的方法?
答案 - 正如我所怀疑的,解决方案是将其包装在提供可标记性的BufferedInputStream中.谢谢Rasmus.
对于一般的InputStream,我会将它包装在BufferedInputStream中,并执行以下操作:
BufferedInputStream bis = new BufferedInputStream(inputStream); bis.mark(2); int byte1 = bis.read(); int byte2 = bis.read(); bis.reset(); // note: you must continue using the BufferedInputStream instead of the inputStream
您可能会发现PushbackInputStream很有用:
http://docs.oracle.com/javase/6/docs/api/java/io/PushbackInputStream.html
当使用BufferedInputStream确保inputStream尚未缓冲时,双缓冲将导致一些严重难以发现的错误.此外,您需要以不同方式处理读者,转换为StreamReader,如果Reader是缓冲的,缓冲将导致字节丢失.此外,如果您使用的是Reader,请记住您没有读取字节,而是使用默认编码中的字符(除非设置了显式编码).您可能不知道的缓冲输入流的示例是URL URL; url.openStream();
我没有任何关于此信息的参考,它来自调试代码.我遇到问题的主要案例是从文件读入压缩流的代码.如果我在开始调试代码时记得正确,那么Java源代码中的注释表明某些事情总是无法正常工作.我不记得使用BufferedReader和BufferedInputStream的信息来自哪里,但我认为即使是最简单的测试也会立即失败.记住测试一下,你需要标记超过缓冲区大小(BufferedReader与BufferedInputStream不同),当读取的字节到达缓冲区末尾时会出现问题.请注意,源代码缓冲区大小可能与您在构造函数中设置的缓冲区大小不同.我这样做了一段时间,所以我对细节的回忆可能有些偏差.使用FilterReader/FilterInputStream进行测试,将一个添加到直接流,一个添加到缓冲流以查看差异.