我有点问题
我正在运行一个包含许多类的程序,其中一个驱动程序可以运行所有这些类。当我运行驱动程序时,输出在控制台上打印就好了,但我还需要从控制台输出的确切输出才能打印到文件中。
但是,我似乎无法将控制台输出打印到文件中。我在这里试过了这个建议
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();
}
}
}
但是文件仍然是空白的(也许是因为print语句在其他文件中?)。
有没有人有任何想法?
答案 0 :(得分: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();
答案 1 :(得分: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 package等等)进行日志记录,那么我将其留给您的用户并使用err / out而不是过度使用它。 java -jar myjar.jar > log.txt