在Java中编辑二进制文件

2022-06-17 00:00:00 binaryfiles 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();
   }

相关文章