1. ホーム
  2. java

[解決済み] Javaで既存のファイルにテキストを追加する方法は?

2022-03-14 13:08:30

質問

Javaで既存のファイルに繰り返しテキストを追加する必要があります。どうすればいいですか?

どのように解決するのですか?

ログを取る目的で行っているのですか? もしそうなら、次のようなものがあります。 このためのライブラリがいくつかあります。 . 最も人気のある2つは Log4j ログバック .

Java 7+

ワンタイム・タスクの場合 ファイルクラス を使えば簡単にできます。

try {
    Files.write(Paths.get("myfile.txt"), "the text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
    //exception handling left as an exercise for the reader
}

注意深く : 上記のアプローチでは NoSuchFileException が存在しない場合、そのファイルを削除します。また、自動的に改行されることもありません(テキストファイルへの追加ではよくあることです)。別の方法として CREATEAPPEND オプションで、ファイルがまだ存在しない場合に最初に作成されます。

private void write(final String s) throws IOException {
    Files.writeString(
        Path.of(System.getProperty("java.io.tmpdir"), "filename.txt"),
        s + System.lineSeparator(),
        CREATE, APPEND
    );
}

しかし、同じファイルに何度も書き込むような場合、上記のスニペットはディスク上のファイルを何度も開いたり閉じたりしなければならず、動作が遅くなります。この場合 BufferedWriter の方が速いです。

try(FileWriter fw = new FileWriter("myfile.txt", true);
    BufferedWriter bw = new BufferedWriter(fw);
    PrintWriter out = new PrintWriter(bw))
{
    out.println("the text");
    //more code
    out.println("more text");
    //more code
} catch (IOException e) {
    //exception handling left as an exercise for the reader
}

注意事項

  • の2番目のパラメータは FileWriter コンストラクタは、新しいファイルを作成するのではなく、ファイルに追加するように指示します。(ファイルが存在しない場合は作成されます。)
  • を使用すると BufferedWriter は、高価なライターを使用することをお勧めします(例えば FileWriter ).
  • を使用することで PrintWriter にアクセスできるようになります。 println の構文に慣れているはずです。 System.out .
  • しかし BufferedWriterPrintWriter のラッパーは厳密には必要ない。

古いJava

try {
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
    out.println("the text");
    out.close();
} catch (IOException e) {
    //exception handling left as an exercise for the reader
}


例外処理

古いJavaのために堅牢な例外処理が必要な場合、非常に冗長になります。

FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
    fw = new FileWriter("myfile.txt", true);
    bw = new BufferedWriter(fw);
    out = new PrintWriter(bw);
    out.println("the text");
    out.close();
} catch (IOException e) {
    //exception handling left as an exercise for the reader
}
finally {
    try {
        if(out != null)
            out.close();
    } catch (IOException e) {
        //exception handling left as an exercise for the reader
    }
    try {
        if(bw != null)
            bw.close();
    } catch (IOException e) {
        //exception handling left as an exercise for the reader
    }
    try {
        if(fw != null)
            fw.close();
    } catch (IOException e) {
        //exception handling left as an exercise for the reader
    }
}