1

我正在运行以下代码:

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 个字节?

4

2 回答 2

4

DataInputStream 正在通过 FileInputStream 向下传递,该 FileInputStream 声明其跳过的实现如下:

“此方法可能会跳过比支持文件中剩余的字节更多的字节。这不会产生异常,并且跳过的字节数可能包括超出支持文件的 EOF 的一些字节数。尝试在跳过后从流中读取过去end 将导致 -1 指示文件的结尾。”

于 2012-07-16T19:37:03.757 回答
1

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

于 2012-07-16T19:35:53.930 回答