Java BufferedInputStream 行为

标签 java inputstream behavior bufferedinputstream

如果文件大小 > 8k,为什么读取的最后一个字节 = 0?

private static final int GAP_SIZE = 8 * 1024;

public static void main(String[] args) throws Exception{
    File tmp = File.createTempFile("gap", ".txt");
    FileOutputStream out = new FileOutputStream(tmp);
    out.write(1);
    out.write(new byte[GAP_SIZE]);
    out.write(2);
    out.close();
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(tmp));
    int first = in.read();
    in.skip(GAP_SIZE);
    int last = in.read();
    System.out.println(first);
    System.out.println(last);
}

最佳答案

InputStream API 表示,由于各种原因,skip 方法最终可能会跳过一些较小数量的字节。试试这个

...
long n = in.skip(GAP_SIZE);
System.out.println(n);
...

它打印 8191 而不是预期的 8192。这与 BufferedInputStream 实现细节有关,如果您删除它(无论如何在这种具体情况下它不会提高性能),您将得到预期的结果

...
InputStream in = new FileInputStream(tmp);
...

输出

1
2

关于Java BufferedInputStream 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16868748/

相关文章:

java - 如何读取文本文件中除最后一行之外的整个文本?

android - InputStream 不会关闭,或需要永远

java - BufferedInputStream 没有标记

symfony1 - Symfony Doctrine versionnable行为忽略字段

java - 从 servlet 向 java 类发送参数

java - BeanUtils 日期转换问题

java 。具有静态成员的嵌套类。我们如何规避它?

Yii2 在保存时修剪所有内容

c# - EventTriggerBehavior Taped 未触发

java - 如何使用 JProfiler 在 Debug模式下分析 Java 应用程序