在Java中编辑二进制文件
我需要做这个项目,从其中读取一个二进制文件,然后创建一个新的二进制文件,该文件根据偏移量添加00。例如,如果二进制数的偏移量为02,则该二进制数将移位2。因此,二进制数的偏移量为04。中间有00。
我正在考虑使用随机访问文件来访问和编辑(只读)。但我被您要查找的字节数搞糊涂了。另外,如何编辑修改内容并将其放入全新的文件中。
致以最诚挚的问候
解决方案
在上图中。蓝色(0x54)
的第一个字节位于0x40 + 0x0E
。将左侧的行值与列值相加。因此,您必须读取除该字节以外的所有内容。因此,这将被补偿0x40 + 0x0D
。那将是64 + 13 = 77
。由于偏移量从0
开始,因此请读入前78
字节,然后写出您想要的内容。然后写出文件的其余部分。这意味着所有的蓝色都将写在您的特殊插入之后。
这一切都是假定的,这就是你想要做的。但是您不能真正使用seek
,因为这意味着您正在修改源文件,这是不明智的(因为您可能会犯错误,需要重新开始)。此外,搜索正在修改的文件可能会非常有问题,因为它的大小可能会不断变化。无论如何,请确保保留该文件的备份副本。
若要进行进一步修改,请按说明继续读取和写入。
这里有一个暴力的例子。可以适当地使用Try-with-Resources和循环来改进它。例外情况被推定为受到监控。此示例仅在指定位置插入两个三元组整数,并打印新文件。
// create a file to start
FileOutputStream fo = new FileOutputStream("myfile.txt");
String alpha = "abcdefghijklmnopqrstuvwxyz";
fo.write(alpha.getBytes());
fo.close();
// create the new output file and open up the old one as an input
// file
fo = new FileOutputStream("myfile2.txt");
FileInputStream fi = new FileInputStream("myfile.txt");
// insert 123 after k
byte[] buf = new byte[100];
int count = fi.read(buf, 0, 11); // read up to and including k
fo.write(buf, 0, count);
fo.write("123".getBytes());
// insert 456 after t
count = fi.read(buf, 0, 9);
fo.write(buf, 0, count);
fo.write("456".getBytes());
//copy rest of input file to output file
while ((count = fi.read(buf, 0, 10)) > 0) {
fo.write(buf, 0, count);
}
fo.close();
fi.close();
fi = new FileInputStream("myfile2.txt");
byte[] buffer = fi.readAllBytes();
for (byte b : buffer) {
System.out.print((char) b);
}
System.out.println();
fi.close();
}
相关文章