web-dev-qa-db-ja.com

ファイル内の特定の位置にコンテンツを書き込む方法

Abhishek.txtという名前のファイルがあり、次の行が含まれているとします。

私は、あなたの名前は何ですか。

今書きたい

Abhishek

私はAbhishekのように「私は」の後、..この特定の位置にコンテンツを直接書き込む方法。

12

ファイルにデータを挿入することはできません。特定の場所のデータをRandomAccessFileで上書きできます。ただし、挿入には、その後のすべてのデータを変更する必要があります。あなたの場合は、代わりに次のようなものを試してください。

File file = new File("abhishek.txt");
Scanner scanner = new Scanner(file).useDelimiter("\n");
String line = scanner.next();
String newLine = line.substring(0, 5) + "Abhishek" + line.substring(5);
FileWriter writer = new FileWriter(file);
writer.write(newLine);
writer.close();
7
WhiteFang34

ファイルにデータを挿入することはできません...ファイルシステム(一般的に)は、単にそのような操作をサポートしていません。通常、1つのファイルを読み取り用に開き、別のファイルを書き込み用に開き、ファイルの最初の部分を1つのストリームから別のストリームにコピーし、余分な部分を書き込んでから、ファイルの2番目の部分をコピーします。

元のファイルを置き換えようとしている場合は、そのファイルを削除して、新しいファイルを所定の場所に移動する必要があります。

ファイル全体を一度にメモリに読み込む方が簡単な場合もあります。これは、実行しようとしていることと、ファイルの大きさによって異なります。

11
Jon Skeet

一般的に言えば、古いファイルを読み取り、メモリ内の内容を変更して、再度書き戻す必要があります。

ここでは、ファイルを一度に読み取るか、一度に小さな部分を読み取るか、既存のファイルを置き換えるかなど、多くのオプションがありますが、これは通常、使用するパターンです。

3
MeBigFatGuy

3つの選択肢があります。

  1. RandomAccessFileを使用できる十分なスペースで元のエントリを埋めます(余分な末尾のスペースは気にしません。簡単ですが、ユーティリティは限られています
  2. これを頻繁に行う場合は、テンプレートエンジン(StringTemplate、Velocityなど)を使用してください。これを1回だけ実行すると、作業が多すぎる可能性があります。
  3. それをメモリに読み込む独自の単純なテンプレートエンジンを作成して、正規表現を置き換えて書き戻します。特に効率的ではありませんが、使用法が非常に単純で制限されている場合は、おそらく最善の妥協点です。
2
MJB

私はRandomAccessFileを使用してそれを行うことができました:

enter image description here

これにより、期待される「IamAbhishek」コンテンツを正確に含むファイルが得られます。これは、最初の行の後にコンテンツがあり、ファイルに保持したい場合でも機能します(これは私の最初の問題でした:大きなファイルがあり、特定の文字列の後にコンテンツを挿入する必要がありました)。ファイルの終わり。これは簡単です。

2
Crenguta S