Java InputStream.skip()在文件末尾附近返回值

时间:2012-07-16 19:22:31

标签: java inputstream

我正在运行以下代码:

public class SkipTest {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileout = new FileOutputStream("./foo");
        DataOutputStream output = new DataOutputStream( fileout );
        output.writeLong(12345678L);
        output.writeLong(87654321L);
        output.writeInt(1234);
        output.flush();
        output.close();

        FileInputStream input = new FileInputStream("./foo");
        DataInputStream datain = new DataInputStream(input);

        System.out.println(datain.readLong());
        System.out.println(datain.readLong());

        long skipped = datain.skip(8);
        System.out.printf("Attempting to skip 8 bytes, actually skipped %d.\n", skipped);

        datain.close();
    }
}

根据文档,.skip()的返回值是跳过的实际字节数,可能小于请求的数量。我已经验证外部文件只有20个字节,但是当我运行上面的代码时,我得到以下输出:

12345678
87654321
Attempting to skip 8 bytes, actually skipped 8.

这是一个错误还是我做错了什么?当文件中只剩4个时,如何跳过8个字节?

2 个答案:

答案 0 :(得分:4)

DataInputStream向下传递FileInputStream,它声明了以下实现的跳过:

"此方法可能会跳过比备份文件中剩余的更多的字节。这不会产生异常,跳过的字节数可能包括超出后备文件EOF的一些字节数。跳过结束后尝试从流中读取将导致-1表示文件结束。"

答案 1 :(得分:1)

您可以跳过FileInputStream中的任意数量的字节,显然没有读取任何内容。它只会重新定位光标,然后下一次读取将失败。试试datain.skip(Integer.MAX_VALUE)