14

以下のように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();
    }
}
4

6 に答える 6

20

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

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();
    }
}
于 2012-12-06T10:45:52.347 に答える
14

受け入れられた答えは素晴らしいです。commons-ioただし、Apache のライブラリを使用してファイル内のコンテンツを置き換える簡単な方法があります( 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されたものは、それに応じてアプリケーションでキャッチして処理する必要があります。

于 2015-08-07T07:45:07.693 に答える
3

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

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

于 2012-12-06T10:41:36.137 に答える
2

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

  • close不要になったときの任意のストリーム
  • 特に、書き込みのために再度開く前に。
  • truncate書き込み量が少なくなった場合にファイルが縮小されるようにします。
  • 次に、出力を書き込みます
  • 個々の行を書きます。に依存しないでくださいtoString
  • flushそしてclose書き終わったら!

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

于 2012-12-06T10:39:47.773 に答える
0

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

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

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

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

于 2012-12-06T10:45:32.197 に答える
0

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

    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();
    }
}
于 2016-10-14T10:51:54.250 に答える