gpt4 book ai didi

java - writeInt(Integer) 覆盖零

转载 作者:行者123 更新时间:2023-11-30 05:45:42 25 4
gpt4 key购买 nike

使用RandomAccessFile类,我试图测试在java中写入/读取文件的概念。所以我尝试了这段代码:

public static void main (String[] args) throws IOException {
RandomAccessFile storage = new RandomAccessFile("FILE.txt", "rw");

storage.seek(0);
storage.writeInt(1);

storage.seek(1);
storage.writeInt(2);

storage.seek(2);
storage.writeInt(3);

storage.seek(3);
storage.writeInt(4);

storage.seek(4);
storage.writeInt(5);

System.out.println(storage.readInt());
System.out.println(storage.readInt());
System.out.println(storage.readInt());
System.out.println(storage.readInt());
System.out.println(storage.readInt());

storage.close();

我认为它应该打印:12345

但是会打印出:345EOFException...为什么?

最佳答案

这里有两个问题 - 您不允许每个 int 写入 4 个字节,并且在读取 int 时您不会返回到文件的开头回到内存中。

首先,seek 方法采用字节数参数作为文件的偏移量。

pos - the offset position, measured in bytes from the beginning of the file, at which to set the file pointer.

但在 Java 中,int 有 4 个字节,因此每次后续写入都会覆盖前一个 int 的 4 个字节中的 3 个。要么每次显式地将标记设置为 4 个字节:

storage.seek(4);
storage.writeInt(2);

storage.seek(8);
storage.writeInt(3);

// etc.

或者更简单的是,标记“做正确的事情”并向前移动适当的字节数。只需省略此处的 seek 即可。

storage.writeInt(1);
storage.writeInt(2);
storage.writeInt(3);
storage.writeInt(4);
storage.writeInt(5);

第二个问题是,当读回字节时,您没有将标记重置回文件的开头,从而导致 EOFException。添加对 seek(0) 的调用,以将标记发送回文件的开头。

storage.seek(0);

System.out.println(storage.readInt());
System.out.println(storage.readInt());
System.out.println(storage.readInt());
System.out.println(storage.readInt());
System.out.println(storage.readInt());

然后我得到输出:

1
2
3
4
5

关于java - writeInt(Integer) 覆盖零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54871573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com