首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java BufferedInputStream行为

Java BufferedInputStream行为
EN

Stack Overflow用户
提问于 2013-06-01 11:20:51
回答 2查看 1.1K关注 0票数 2

当文件大小大于8k时,为什么读取的最后一个字节=0?

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-01 11:36:56

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

代码语言:javascript
复制
...
long n = in.skip(GAP_SIZE);
System.out.println(n);
...

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

代码语言:javascript
复制
...
InputStream in = new FileInputStream(tmp);
...

输出

代码语言:javascript
复制
1
2
票数 2
EN

Stack Overflow用户

发布于 2013-06-01 11:34:33

正如感知力所说,你需要检查skip的返回。如果我添加一个检查并进行补偿,它就可以解决这个问题:

代码语言:javascript
复制
long skipped = in.skip(GAP_SIZE);
System.out.println( "GAP: " + GAP_SIZE + " skipped: " + skipped ) ;
if( skipped < GAP_SIZE)
{
   skipped = in.skip(GAP_SIZE-skipped);
}

FileInputStreamskip部分所述

由于各种原因,

方法可能会跳过一些较小的字节数,可能是0

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16868748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档