web-dev-qa-db-ja.com

Javaを使用してファイルの内容を変更します

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();
    }
}
8
Adesh singh

私はリーダーを閉じ、ライターをフラッシュすることから始めます:

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();
    }
}
14
Mateusz

受け入れられた答えは素晴らしいです。ただし、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は、アプリケーションによってキャッチおよび処理する必要があります。

9
Sandeep Salian

同じファイルへの読み取りと書き込みを同時に行うことはできません。

編集:言い換えると、より正確で具体的になるように-リーダーを適切に閉じずに(そしてライターを混乱させずに)、同じスレッドで同じファイルを読み書きすることはできません。

3
acostache

次のことを確認してください。

  • close不要になったストリーム
  • 特にbefore書き込みのために再び開きます。
  • truncateファイル。書き込み量が少ない場合にファイルが縮小することを確認します。
  • 次に、出力を書き込みます
  • 個々の行を書き、toStringに依存しないでください。
  • flushcloseを書き終えたら、

buffered IOを使用する場合は、常にバッファーが最後にフラッシュされるようにする必要があります。そうしないと、データが失われる可能性があります。

2
Anony-Mousse

私は3つの問題を見ることができます。

まず、outに書き込んでいます。これは、ファイルへの出力ストリームではなく、System.outであると想定しています。

次に、ファイルへの出力ストリームに書き込む場合は、ファイルを閉じる必要があります。

3番目に、ArrayListtoString()メソッドは、期待どおりにファイルを書き込みません。リストをループして、一度に1つずつStringを書き込みます。改行文字も書く必要があるかどうかを自問してください。

0
Qwerky

受け入れられた答えは少し間違っています。これが正しいコードです。

    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();
    }
}
0
Ravi K M