2014-09-25 31 views
0

我有一點問題的Java:打印到控制檯和一個文件

我正在與許多類節目中,有一個驅動器來運行所有這些類。當我運行驅動程序時,輸出在控制檯上打印得很好,但我還需要將控制檯的確切輸出打印到文件中。

但是,我似乎無法得到控制檯輸出打印到文件。我試圖在這裏

How to write console output to a txt file

建議通過這樣做

import java.io.FileOutputStream; 
import java.io.PrintStream; 



public class Compiler { 
    public static void main(String args[]){ 
     try { 

      Parse parser = new Parse(); 
      SemanticAnalyzer sAnalyzer = new SemanticAnalyzer(); 
      String parserfile= parser.parsefile(args[0]); 
      sAnalyzer.semanticAnalysis(parserfile); 
      PrintStream out = new PrintStream(new FileOutputStream("output.txt")); 
      System.setOut(out); 

     } catch (Exception e) { 

      e.printStackTrace(); 
     } 


    } 
} 

但文件仍然出來空白(也許是因爲打印語句在其他文件?)。

有沒有人有什麼想法?

+1

你應該在任何控制檯輸出之前調用setOut – dragon66 2014-09-25 01:41:39

回答

1

創建,你會在你的代碼輸出任何打印到兩個流時所使用的方法:

private void output(String text, PrintStream ps1, PrintStream ps2) {   
    ps1.println(text); 
    ps2.println(text); 
} 

而且從代碼中調用它:

PrintStream ps = new PrintStream(new FileOutputStream("output.txt")); 

output("text1", System.out, ps); 
output("text2", System.out, ps); 
output("text3", System.out, ps); 

ps.close(); 
+0

謝謝!,但現在它不打印到控制檯:/這裏的任何想法? – Razor88 2014-09-25 01:54:50

+0

@ Razor88您的方法可用於打印到控制檯或文件。要打印到這兩者,您可以執行日誌記錄(例如log4j),打印到兩個(Apache Commons IO)的外部庫,或者構建如上所示的方法以打印到兩個(或更多)流。 – Voicu 2014-09-25 02:50:48

1

我敢肯定這將在我輸入完畢之前得到解答......但是,這裏發生的是您將(默認)輸出流從控制檯重定向到文件。如果你想打印到兩個位置,你需要有一個PrintStream實際記錄到兩個位置。 (或者你可以去查找一個日誌記錄解決方案 - 有幾個)。然而,在被輕度學術關於它的興趣:

http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html

您可以實現通過實現接口和記錄到文件和控制檯中都做這一個PrintStream或OutputStream的(可能是更好的選擇)每個案例(yikes!)。

以上由@Voicu解釋過,但感覺有點誤導的更簡單的方法是通過創建一個新方法來替換System.out();調用,該方法將這些流指定爲輸出的一部分。你可以很容易地創建一個靜態方法來解決這個問題:

//Redirect via a method 
public static PrintStream FILE = new PrintStream(new FileOutputStream("output.txt")); 

public static void log(String x) 
{ 
    FILE.println(x); 
    System.out.println(x); 
} 

現在可怕,但功能的解決方案,將是這個樣子:

public static class DualStream extends PrintStream 
    { 
     private PrintStream out; 
     private PrintStream file; 

     public DualStream(File file, PrintStream out) throws FileNotFoundException 
     { 
      super(file);//I'm being SUPER lazy/hacky here 
      this.out = out; 
      this.file = new PrintStream(file); 
     } 

     //... through all the methods I want to use... 

     public void println(String x) { 
      out.println(x); 
      file.println(x); 
     } 
    } 

    public static void main(String ... args) throws FileNotFoundException 
    { 
     DualStream out = new DualStream(new File("output.txt"), System.out); 
     System.setOut(out); 

     System.out.println("This is a test"); 
    } 

現在,這是可怕的代碼,首先我違反我的施工合同,使這項工作,但它確實工作。我不建議這樣做,我只是想證明,如果你真的需要它,「可以完成」。正確的做法是使用其中的一個記錄器,或坦率地說,將命令行上的輸出重定向到你想要的地方。

你在這種情況下,需要的是使用操作系統或正在運行的服務器: (how to redirect a output of a command to two files) 這不正是你想要什麼,但允許用戶根據需要登錄。如果您不想使用日誌記錄系統(Log4J,Logging軟件包等)進行日誌記錄,那麼我會把它留給用戶,只是使用err/out而不是過度使用它。java -jar myjar.jar > log.txt