4

こんにちはチーム、バイナリファイルで文字列「Henry」を見つけて、その文字列を別の文字列に変更しようとしています。参考までに、ファイルはオブジェクトのシリアル化の出力です。元の質問はこちら

私はバイトを検索するのが初めてで、このコードが私のバイト[]を検索して交換すると想像しました。しかし、それは動作に近づくことはなく、一致するものさえ見つかりません。

{
    byte[] bytesHenry = new String("Henry").getBytes();
    byte[] bytesSwap = new String("Zsswd").getBytes();

    byte[] seekHenry = new byte[bytesHenry.length];

    RandomAccessFile file = new RandomAccessFile(fileString,"rw");

    long filePointer;
    while (seekHenry != null) {
       filePointer = file.getFilePointer();
       file.readFully(seekHenry);
       if (bytesHenry == seekHenry) {
           file.seek(filePointer);
           file.write(bytesSwap);
           break;
       }
     }
}

さて、私はbytesHenry==seekHenry問題を見て、に交換しますArrays.equals( bytesHenry , seekHenry )

5 バイトを読み取るたびに、-4 バイト位置ずつ移動する必要があると思います。


今見つけたビンゴ

    while (seekHenry != null) {
                    filePointer = file.getFilePointer();
                    file.readFully(seekHenry);;
                    if (Arrays.equals(bytesHenry,
                                      seekHenry)) {
                        file.seek(filePointer);
                        file.write(bytesSwap);
                        break;
                    }
                    file.seek(filePointer);
                    file.read();
                }
4

2 に答える 2

0

java を使用してテキスト ファイル内の文字列を検索する最速の方法から:

MIMEParser で見つけた最高の実現: https://github.com/samskivert/ikvm-openjdk/blob/master/build/linux-amd64/impsrc/com/sun/xml/internal/org/jvnet/mimepull/ MIMEParser.java

/**
  * Finds the boundary in the given buffer using Boyer-Moore algo.
  * Copied from java.util.regex.Pattern.java
  *
  * @param mybuf boundary to be searched in this mybuf
  * @param off start index in mybuf
  * @param len number of bytes in mybuf
  *
  * @return -1 if there is no match or index where the match starts
  */

  private int match(byte[] mybuf, int off, int len) {

また必要:

  private void compileBoundaryPattern();
于 2015-03-01T10:05:02.060 に答える