web-dev-qa-db-ja.com

Javaで既存のファイルに新しいテキスト行を追加する方法は?

そのファイルの現在の情報を消去せずに、既存のファイルに新しい行を追加したいと思います。要するに、現在の時間を使用している方法は次のとおりです。

import Java.io.BufferedWriter;
import Java.io.FileWriter;
import Java.io.Writer;

Writer output;
output = new BufferedWriter(new FileWriter(my_file_name));  //clears file every time
output.append("New Line!");
output.close();

上記の行の問題は、単に既存のファイルのすべての内容を消去してから、新しい行のテキストを追加することです。

何も消去または置換せずに、ファイルの内容の最後にテキストを追加したい。

79
CompilingCyborg

追加モードでファイルを開く必要があります。これは、FileWriter(String fileName, boolean append)コンストラクターを使用して実現できます。

output = new BufferedWriter(new FileWriter(my_file_name, true));

トリックを行う必要があります

117
Mario F

FileWriterを使用したソリューションは機能していますが、出力エンコーディングを指定する可能性はありません。その場合、マシンのデフォルトエンコーディングが使用され、通常はUTF-8ではありません。

したがって、せいぜいFileOutputStreamを使用してください:

    Writer writer = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream(file, true), "UTF-8"));
24
Danubian Sailor

試してください: "\ r\n"

Java 7の例:

// append = true
try(PrintWriter output = new PrintWriter(new FileWriter("log.txt",true))) 
{
    output.printf("%s\r\n", "NEWLINE");
} 
catch (Exception e) {}
11
Stofkn

Java 7から開始:

パスと、先頭に行区切り文字を含む文字列を定義します。

Path p = Paths.get("C:\\Users\\first.last\\test.txt");
String s = System.lineSeparator() + "New Line!";

そして、次のアプローチのいずれかを使用できます。

  1. Files.write (小さなファイル)を使用:

    try {
        Files.write(p, s.getBytes(), StandardOpenOption.APPEND);
    } catch (IOException e) {
        System.err.println(e);
    }
    
  2. Files.newBufferedWriter (テキストファイル)の使用:

    try (BufferedWriter writer = Files.newBufferedWriter(p, StandardOpenOption.APPEND)) {
        writer.write(s);
    } catch (IOException ioe) {
        System.err.format("IOException: %s%n", ioe);
    }
    
  3. Files.newOutputStream を使用する(Java.io APIと相互運用可能):

    try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(p, StandardOpenOption.APPEND))) {
        out.write(s.getBytes());
    } catch (IOException e) {
        System.err.println(e);
    }
    
  4. Files.newByteChannel (ランダムアクセスファイル)の使用:

    try (SeekableByteChannel sbc = Files.newByteChannel(p, StandardOpenOption.APPEND)) {
        sbc.write(ByteBuffer.wrap(s.getBytes()));
    } catch (IOException e) {
        System.err.println(e);
    }
    
  5. FileChannel.open (ランダムアクセスファイル)の使用:

    try (FileChannel sbc = FileChannel.open(p, StandardOpenOption.APPEND)) {
        sbc.write(ByteBuffer.wrap(s.getBytes()));
    } catch (IOException e) {
        System.err.println(e);
    }
    

これらのメソッドの詳細は Oracleのチュートリアル にあります。

11

ファイルを作成してファイルに書き込む切り取りと貼り付けの方法を探している場合は、文字列の入力のみを受け取るように書きました。毎回ファイルを上書きする場合は、PrintWriterから「true」を削除します。

private static final String newLine = System.getProperty("line.separator");

private synchronized void writeToFile(String msg)  {
    String fileName = "c:\\TEMP\\runOutput.txt";
    PrintWriter printWriter = null;
    File file = new File(fileName);
    try {
        if (!file.exists()) file.createNewFile();
        printWriter = new PrintWriter(new FileOutputStream(fileName, true));
        printWriter.write(newLine + msg);
    } catch (IOException ioex) {
        ioex.printStackTrace();
    } finally {
        if (printWriter != null) {
            printWriter.flush();
            printWriter.close();
        }
    }
}
4
MattC

2行目でnew FileWriter(my_file_name)new FileWriter(my_file_name, true)に変更して、上書きするのではなくファイルに追加するようにします。

File f = new File("/path/of/the/file");
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));
            bw.append(line);
            bw.close();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
3
Tim Niblett

ファイルにデータを追加する場合は、FileWriter(String fileName, boolean append)コンストラクターを使用できます。

コードをこれに変更します。

output = new BufferedWriter(new FileWriter(my_file_name, true));

FileWriter javadocから:

ファイル名を指定してFileWriterオブジェクトを構築します。 2番目の引数がtrueの場合、バイトはファイルの先頭ではなく末尾に書き込まれます。

2
Buhake Sindi