2014-02-16 44 views
0

以下代碼將運行cmd中的命令,並使用命令行的輸出生成文本文件。下面的代碼顯示了Eclipse輸出窗口中的正確信息,但文本文件中只打印了最後一行。誰能幫我這個?在文本文件(java)中寫入多行

import java.io.*; 

public class TextFile { 
public static void main(String[] args) throws IOException { 
    try { 
     Process p = Runtime.getRuntime().exec("git log"); 

     BufferedReader in = new BufferedReader(
       new InputStreamReader(p.getInputStream())); 
     BufferedWriter writer = null; 

     String line = null; 
     while ((line = in.readLine()) != null) { 

      writer = new BufferedWriter(new FileWriter("textfile.txt")); 
      writer.write(line); 
      System.out.println(line); 

      writer.close(); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 

    } 

    } 
} 
+2

通過在每次迭代中創建一個FileWriter,該文件被覆蓋。在循環之外聲明Writers並在循環之後關閉它。 (順便說一下,你的代碼很難閱讀,下次請遵守一致的注意事項,這樣可以更容易地發現此類錯誤。) – qqilihq

+0

請注意,**現在**應該使用java的新IO庫,稱爲'NIO'。核心類是'Paths','Path'和'Files'。例如,你可以通過'Paths.get(「filename」)找到文件或者用'Files.write(pathToFile,stuffToWrite,options)'寫入文件。 – Zabuza

回答

0

問題是你正在循環中創建一個新的BufferedWriter。其次,你也在循環中關閉作者。最後,您的代碼塊有點令人困惑 - 如果您重新設置代碼的格式(在Eclipse中使用Ctrl-F自動執行代碼),代碼中的塊將更清晰。

您的代碼應該是這樣的,在try/catch塊的try部分內:

BufferedWriter writer = (new FileWriter ("textfile.txt")); 

    String line =null; 
    while ((line= in.readLine()) !=null) { 
     writer.write(line); 
     System.out.println(line); 
    } 
    writer.close(); 
2

正如其他回答說,問題是,你正在創建BufferedWriter實例內部while循環,這就是爲什麼只有最後一行是打印在文件中。

其中一個更好的方式來編寫使用try-with-resources這個程序 -

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class TextFile { 

    public static void main(String[] args) throws IOException { 
     try { 
      Process p = Runtime.getRuntime().exec("git log"); 

      try (BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
        BufferedWriter writer = new BufferedWriter(new FileWriter("textfile.txt"))) { 

       String line = null; 
       while ((line = in.readLine()) != null) { 
        writer.write(line); 
        writer.newLine(); 
        System.out.println(line); 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 

     } 
    } 
}