ファイルの特定のコンテンツをインプレースで変更する必要があります。新しいファイルを作成して古いファイルを書き換えたく
ありません。また、ファイルはそれぞれ最大数 MB と小さいです。
疑問に思っている人のために (これが OP に関連しているかどうかはわかりませんが)、バージョン管理の一部であるファイルを変更する必要があり、読み取り専用バージョンを変更する必要があります。その場で変更を行う方がはるかに簡単です。
これはJava APIで可能ですか?
そうでない場合、これを提供するライブラリはありますか?
3 に答える
Java では、ディスク上のファイルへのランダム アクセスと書き込みが可能です。ただし、ファイルの途中への書き込みはバイトのみを上書きできます。つまり、特定のバイトを他のバイトに置き換えます。ファイルの途中にデータを挿入することはできません。そのためには、挿入ポイント以降のすべてを書き直さなければなりません。char[]
ファイルは、たまたまディスク上に存在する文字の配列 ( ) と考えてください。ランダムアクセスを使用すると、次のことと同等のことができます
char[] file = ... // the file on disk
char[] newData = ... // the data to be written
int pos = ... // the position in the file to write to
for (i=0; i<newData.; i++)
{
file[pos+i] = newData[i];
}
ファイルにデータを挿入するには、データを配列に挿入するのと同じプロセスが必要です。挿入ポイントの後のすべてのデータは、挿入されたデータに対応するために右に移動する必要があります。より短い文字列に置き換える(バイトを削除する) 場合は、編集後のデータを左にシフトする必要があります。
第二に、あなたは次のように述べています。
バージョン管理の一部であるファイルを変更する必要があり、読み取り専用バージョンを変更する必要があります
読み取り専用はまさにそれを意味します。ファイルが読み取り専用の場合、ランダム アクセスを使用するかどうかに関係なく、ファイルを変更することはできません。
また、コメントで次のように述べています。
新しいファイルはソース管理下にありません。追加する方法を見つける必要があります。これを回避しようとしています
ファイルがソース管理下にある場合は、ローカル コピーで作業している可能性が高くなります。更新されたファイルが元のファイルと同じ名前で同じディレクトリにある限り、ファイルの新しいインスタンスを作成しても違いはありません。更新されたバージョンをソース管理システムにコミットするだけです。
ただし、ソース管理システムのリポジトリ内でファイルを更新すると、システムに永久的な損傷を与える可能性があります。
ファイルの内容をテキストとして操作できるようにしたい場合、およびファイルがメモリに収まると仮定すると(これは有効な仮定です)、CommonsIOのメソッドがFileUtils
役立つ場合があります。
http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html
例えば:
File f = new File("my-file.txt");
List<String> lines = FileUtils.readLines(f, "UTF-8");
List<String> outLines = modify(lines); // Do some line-by-line text processing
FileUtils.writeLines(f, "UTF-8", outLines);
つまり、ファイルのコンテンツをメモリに読み込み、メモリ内で変更してから、元のファイルをメモリの新しいコンテンツで上書きします。それは「インプレース」の基準を満たしていますか?
Java は、特に を使用したランダム ファイル アクセスをサポートしていますseek()
。
見てください:http://docs.oracle.com/javase/tutorial/essential/io/rafs.html