0

ヘッダーを切り取るためにバイナリ編集しようとしているファイルがあります。

ファイルに保持したい実際のデータの開始アドレスを特定しましたが、ファイルから削除するバイトの範囲を指定できるJavaの方法を見つけようとしています。

現在、(Buffered)FileInputStreamでファイルを読み取っていますが、このファイルのヘッダーを切り取る唯一の方法は、開始アドレスからファイルの最後までメモリに保存してから、それを書き出すことです。元のファイルを上書きします。

まったく新しいファイルを作成するプロセスを経ることなく、ファイルのビットを削除する機能はありますか?

4

3 に答える 3

1

ファイルを切り捨てる方法(setLength)はありますが、内部から任意のシーケンスを削除するAPIはありません。

ファイルが大きすぎて書き換えるパフォーマンスの問題がある場合は、いくつかのファイルに分割することをお勧めします。RandomAccessFileを使用して削除のポイントを探し、そこから書き換えてから切り捨てることで、ある程度のパフォーマンスが得られる可能性があります。

于 2013-02-25T07:45:33.017 に答える
0

必要なことを実行するためのAPIメソッドが見つかりませんでした(上記の回答になります)

ファイルを新しいファイルに書き直してから、古いファイルを新しいファイルに置き換えるだけで解決しました。

次のコードを使用して置換を実行しました。

FileOutputStream fout = new FileOutputStream(inFile.getAbsolutePath() + ".tmp");
FileChannel chanOut = fout.getChannel();
FileChannel chanIn = fin.getChannel();

chanIn.transferTo(pos, chanIn.size(), chanOut);

ここで、posは、ファイル転送を開始するための開始アドレスです。これは、このファイルから切り取っているヘッダーのすぐ下にあります。

この方法を使用しても速度が低下しないことにも気づきました

于 2013-02-25T08:22:26.537 に答える
0

これを試してみてください。RandomAccessFile を使用して、最初に開始インデックスをシークし、次に不要な文字をワイプして、ファイルの不要な部分を消去します。

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class Main {
    public static void main(String[] args) {
        int startIndex = 21;
        int numberOfCharsToRemove = 20;

        // Using a RandomAccessFile, overwirte the part you want to wipe
        // out using the NUL character
        try (RandomAccessFile raf = new RandomAccessFile(new File("/Users/waleedmadanat/Desktop/sample.txt"), "rw")) {
            raf.seek(startIndex);

            for (int i = 1; i <= numberOfCharsToRemove; i++) {
                raf.write('\u0000');
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
于 2013-02-25T08:10:31.607 に答える