当前位置:  开发笔记 > 编程语言 > 正文

如何查看InputStream中的前两个字节?

如何解决《如何查看InputStream中的前两个字节?》经验,为你挑选了3个好方法。

应该很简单:我有一个InputStream,我想要查看(不读取)前两个字节,即我希望在我偷看后,InputStream的"当前位置"为0.什么是最好最安全的方法?

答案 - 正如我所怀疑的,解决方案是将其包装在提供可标记性的BufferedInputStream中.谢谢Rasmus.



1> Rasmus Faber..:

对于一般的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



2> Alex Miller..:

您可能会发现PushbackInputStream很有用:

http://docs.oracle.com/javase/6/docs/api/java/io/PushbackInputStream.html


我认为这实际上是简单地偷看几个字节的理想解决方案.BufferedInputStream是非常浪费的内存,如果您只需要检查两个字节!

3> Donal Tobin..:

当使用BufferedInputStream确保inputStream尚未缓冲时,双缓冲将导致一些严重难以发现的错误.此外,您需要以不同方式处理读者,转换为StreamReader,如果Reader是缓冲的,缓冲将导致字节丢失.此外,如果您使用的是Reader,请记住您没有读取字节,而是使用默认编码中的字符(除非设置了显式编码).您可能不知道的缓冲输入流的示例是URL URL; url.openStream();

我没有任何关于此信息的参考,它来自调试代码.我遇到问题的主要案例是从文件读入压缩流的代码.如果我在开始调试代码时记得正确,那么Java源代码中的注释表明某些事情总是无法正常工作.我不记得使用BufferedReader和BufferedInputStream的信息来自哪里,但我认为即使是最简单的测试也会立即失败.记住测试一下,你需要标记超过缓冲区大小(BufferedReader与BufferedInputStream不同),当读取的字节到达缓冲区末尾时会出现问题.请注意,源代码缓冲区大小可能与您在构造函数中设置的缓冲区大小不同.我这样做了一段时间,所以我对细节的回忆可能有些偏差.使用FilterReader/FilterInputStream进行测试,将一个添加到直接流,一个添加到缓冲流以查看差异.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有