2013-11-22 41 views
1

我正在使用PrintWriter類將新行寫入文件。它按預期寫入行,但是當我想寫新數據時,它會寫入舊數據而不是寫新行。這是我到目前爲止。如何在Java中將新行寫入文件?

import javax.swing.*; 
import java.text.*; 
import java.util.*; 
import java.io.*; 

public class TimeTracker 
{ 

    /** 
    * @param args the command line arguments 
    * @throws java.io.FileNotFoundException 
    */ 
    public static void main(String[] args) throws FileNotFoundException 
    { 
     DecimalFormat money = new DecimalFormat("$#,##0.00"); 
     PrintWriter toFile = new PrintWriter("timeWorked.dat"); 
     Scanner readFile = new Scanner(new FileReader("timeWorked.dat")); 

     String client = JOptionPane.showInputDialog("Client's Name"); 
     int rate = Integer.parseInt(JOptionPane.showInputDialog("Rate per hour?")); 
     String output; 
     output = "Client's Name: " + client + 
       " Pay rate agreed: " + money.format(rate) + " per hour"; 
     toFile.append(output); 
     toFile.flush();   
     if (readFile.hasNext()) 
     { 
      toFile.append("\n"); 
      toFile.write(output); 
      toFile.flush(); 
     } 
     JOptionPane.showMessageDialog(null, readFile.nextLine()); 
    } 

} 
+0

你正在閱讀和寫作的同時同一個文件?故意地? – dcsohl

+0

是的,我做了readFile來檢查文件是否有一行,如果它比我想它寫一個新行,而不寫過去的行,但不能讓它工作。 –

回答

3

通過閱讀PrintWriterjavadoc,你可以學習,創造與文件名作爲構造函數的參數,該文件中的一個實例時 - 如果存在的話 - 將被截斷至零大小。

取而代之,您可以使用FileWriter。看一個例子here。 並且不要錯過使用帶有布爾參數的重載構造函數,例如new FileWriter("timeWorked.dat", true),它打開文件進行追加。

+1

+1。再加上OP的原始解決方案,將輸入數據寫入文件**兩次**。 – informatik01

+0

很酷的FileWriter工作!,從來沒有想過使用它,因爲我是新來的Java和我們幾乎沒有學習PrintWriter,雖然謝謝! –

2

從爲PrintWriter的javadoc的:

參數: 文件名的文件的名稱,因爲這writer的目標使用。 如果文件存在,則它將被截斷爲零大小;否則,將創建一個新文件。輸出將被寫入文件並被緩衝。

我想這就是問題所在:)

解決您的問題,使用類的FileWriter如下:

new FileWriter("timeWorked.dat", true) 

布爾參數真告訴FileWriter的打開文件進行追加。這意味着您寫入文件的數據將在最後添加。

0

這個工作對我來說:

File file = new File("output.txt"); 
FileOutputStream outputStream = new FileOutputStream(file, false); 
PrintWriter out = new PrintWriter(outputStream, true); 
out.println("test");