Javaプログラムを使用してファイルの一部のコンテンツを削除したいのですが、これは同じファイルで置き換える書き込みメソッドですか、それとも別のファイルにコピーする必要がありますか?.
しかし、ファイルのすべてのコンテンツを削除します。
class FileReplace
{
ArrayList<String> lines = new ArrayList<String>();
String line = null;
public void doIt()
{
try
{
File f1 = new File("d:/new folder/t1.htm");
FileReader fr = new FileReader(f1);
BufferedReader br = new BufferedReader(fr);
while (line = br.readLine() != null)
{
if (line.contains("Java"))
line = line.replace("Java", " ");
lines.add(line);
}
FileWriter fw = new FileWriter(f1);
BufferedWriter out = new BufferedWriter(fw);
out.write(lines.toString());
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
public statc void main(String args[])
{
FileReplace fr = new FileReplace();
fr.doIt();
}
}
私はリーダーを閉じ、ライターをフラッシュすることから始めます:
public class FileReplace {
List<String> lines = new ArrayList<String>();
String line = null;
public void doIt() {
try {
File f1 = new File("d:/new folder/t1.htm");
FileReader fr = new FileReader(f1);
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
if (line.contains("Java"))
line = line.replace("Java", " ");
lines.add(line);
}
fr.close();
br.close();
FileWriter fw = new FileWriter(f1);
BufferedWriter out = new BufferedWriter(fw);
for(String s : lines)
out.write(s);
out.flush();
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String args[]) {
FileReplace fr = new FileReplace();
fr.doIt();
}
}
受け入れられた答えは素晴らしいです。ただし、Apacheのcommons-io
ライブラリ(commons-io-2.4.jar
-最新バージョンを使用できます)を使用して、ファイル内のコンテンツを置き換える簡単な方法があります。
private void update() throws IOException{
File file = new File("myPath/myFile.txt");
String fileContext = FileUtils.readFileToString(file);
fileContext = fileContext.replaceAll("_PLACEHOLDER_", "VALUE-TO-BE-REPLACED");
FileUtils.write(file, fileContext);
}
注:スローされたIOException
は、アプリケーションによってキャッチおよび処理する必要があります。
同じファイルへの読み取りと書き込みを同時に行うことはできません。
編集:言い換えると、より正確で具体的になるように-リーダーを適切に閉じずに(そしてライターを混乱させずに)、同じスレッドで同じファイルを読み書きすることはできません。
次のことを確認してください。
close
不要になったストリームtruncate
ファイル。書き込み量が少ない場合にファイルが縮小することを確認します。toString
に依存しないでください。flush
とclose
を書き終えたら、buffered IOを使用する場合は、常にバッファーが最後にフラッシュされるようにする必要があります。そうしないと、データが失われる可能性があります。
私は3つの問題を見ることができます。
まず、out
に書き込んでいます。これは、ファイルへの出力ストリームではなく、System.outであると想定しています。
次に、ファイルへの出力ストリームに書き込む場合は、ファイルを閉じる必要があります。
3番目に、ArrayList
のtoString()
メソッドは、期待どおりにファイルを書き込みません。リストをループして、一度に1つずつString
を書き込みます。改行文字も書く必要があるかどうかを自問してください。
受け入れられた答えは少し間違っています。これが正しいコードです。
public class FileReplace {
List<String> lines = new ArrayList<String>();
String line = null;
public void doIt() {
try {
File f1 = new File("d:/new folder/t1.htm");
FileReader fr = new FileReader(f1);
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
if (line.contains("Java"))
line = line.replace("Java", " ");
lines.add(line);
}
fr.close();
br.close();
FileWriter fw = new FileWriter(f1);
BufferedWriter out = new BufferedWriter(fw);
for(String s : lines)
out.write(s);
out.flush();
}
out.close();
catch (Exception ex) {
ex.printStackTrace();
}
}