我正在编写一个Java程序,我打算通过修改游戏的二进制数据来修改某个视频游戏。它存储在一个简单包含游戏数据字节的.dat文件中。我一直在使用FileInputStream
来读取文件,FileOutputStream
来修改内容。但是,据我所知FileOutputStream
只能修改文件的结尾,而不是中间的内容。
我希望能够做到以下几点:
如果这是提供的二进制文件:
06 B4 45 18 A7 DD
我希望能够修改位置n = 3处的字节并将其更改为值v = FF。
导致:
06 B4 45 FF A7 DD
我想把这些数据写回文件。
解决这个问题的最佳方法是什么?现在,我能看到FileOutputStream
工作的唯一方法是,如果我实际上采用原始文件,并从头到尾重新构建它,但在流程中交换新值。但是,考虑到我计划修改的文件每个大约包含20,000个字节,这似乎效率很低。
我觉得必须有一种更简单的方法。有什么建议吗?
答案 0 :(得分:1)
您需要RandomAccessFile。这就足够了,但为了提高性能,您可以使用getChannel()
和ByteBuffer
。
正如名称所示,RandomAccessFile允许在任何地方定位,以及读写。
try (RandomAccessFile fh = new RandomAccessFile(file, "rw")) {
fh.seek(3L);
int old = fh.read(); // 0x18
fh.seek(3L);
fh.write(0xBB);
}