2011-01-06 169 views
68

我想追加一個新行到一個現有的文件,但不刪除該文件的最新信息。總之,這裏是我使用的當前時間的方法:如何在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(); 

與上述各行的問題很簡單,他們被刪除我現有的文件,然後將新行文本的所有內容。

我想在追加的文件的內容的結尾一些文本,而無需刪除或更換任何東西。

+0

@ ripper234哉!它必須被標記爲重複。 – rahulserver 2015-02-05 14:15:04

回答

104

你要打開追加模式的文件,它可以通過使用FileWriter(String fileName, boolean append)構造函數來實現。

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

應該做的伎倆

+2

非常感謝!請在每次輸出結束後添加(「\ n」)嗎?如您所知,它將所有內容都放在一行中,忽略我的「\ n」轉義! – CompilingCyborg 2011-01-06 11:16:32

+8

`BufferedWriter`有一個`newLine()`方法。你可以使用它,或者使用`PrintWriter`來代替,它提供了`println()`方法 – 2011-01-06 11:21:31

+2

謝謝!但出於一些奇怪的原因,當我嘗試使用: output.newLine()|在方法列表中不存在。我正在使用NetBeans 6.9。所有其他方法都存在那裏。你知道可能是什麼原因嗎? – CompilingCyborg 2011-01-06 11:33:22

1

第2行改變new FileWriter(my_file_name)new FileWriter(my_file_name, true)所以你追加到文件,而不是覆蓋。

2

,如果你想將數據追加到文件可以使用FileWriter(String fileName, boolean append)構造。

更改您的代碼如下:

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

從FileWriter的javadoc的:

構造一個FileWriter對象給予 文件名。如果第二個參數是 ,則將字節寫入 的文件,而不是 開始的結束。

20

FileWriter的解決方案正在工作,但是您不可能指定輸出編碼,那麼將使用機器的默認編碼,而且這通常不是UTF-8!

所以最好使用FileOutputStream

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

嘗試: 「\ 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) {} 
3

如果你正在尋找一種創建和寫入文件的剪切和粘貼方法,這裏是我寫的一個只需要一個字符串的方法輸入。如果您想每次覆蓋文件,請從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(); 
     } 
    } 
} 
8

開始的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's tutorial找到。

相關問題