Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 系统输出到字符串_Java_Console - Fatal编程技术网

Java 系统输出到字符串

Java 系统输出到字符串,java,console,Java,Console,我有一个通过windows命令行运行的应用程序,我希望能够复制已发送到控制台的所有数据,并将其附加到文件中以进行调试。每当发生异常时,都会将报告保存到文件系统,其中包括异常堆栈跟踪和完整控制台 我无法将整个控制台重定向到我的文件,因为我需要能够从用户获得控制台输入 System.out.toString()不返回控制台,而是返回对象本身的字符串表示形式。如果使用CMD,可以使用此格式将控制台输出到文本文件 javac{Programe\u name}.java&java{Programe\u n

我有一个通过windows命令行运行的应用程序,我希望能够复制已发送到控制台的所有数据,并将其附加到文件中以进行调试。每当发生异常时,都会将报告保存到文件系统,其中包括异常堆栈跟踪和完整控制台

我无法将整个控制台重定向到我的文件,因为我需要能够从用户获得控制台输入


System.out.toString()不返回控制台,而是返回对象本身的字符串表示形式。

如果使用CMD,可以使用此格式将控制台输出到文本文件

javac{Programe\u name}.java&java{Programe\u name}>{Output\u file\u name>}

例如,如果java程序是World.java


javacWorld.java&javaWorldout.txt

即使不是最好的主意,一个解决方案可能是:

public static void main(String[] xxx) {
    System.setOut(new DoublePrintStream(System.out, "/myfile.txt"));
    System.setErr(new DoublePrintStream(System.err, "/errors.txt"));

    System.out.println("this works");
    try { throw new RuntimeException("oulala");} catch(Exception e) { e.printStackTrace(); }

    //System.out.close(); // maybe required at the end of execution
}

class DoublePrintStream extends PrintStream {
        private final OutputStream fos;

        DoublePrintStream(OutputStream out, String filename){
            super(out);

            try {
                fos = new FileOutputStream(new File(filename));
            } catch (FileNotFoundException e) {
                throw new AssertionError("cant create file", e);
            }
        }

        @Override
        public void write(byte[] buf, int off, int len) {
            super.write(buf, off, len);

            try {
                fos.write(buf, off, len);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        @Override
        public void close() {
            try {
                fos.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                super.close();
            }
        }
    }
因此,您将console+中的输出保存在一个文件中,所有错误保存在一个单独的文件中

即使日志框架更好,这个解决方案的优点是根本不需要更改代码


PS:在多线程环境中,您还应该同步
DoublePrintStream

的方法,我认为这通常是不可能的。您可能需要编写自己的
println
函数来调用一些日志函数,并调用
System.out.println
。您应该使用适当的日志工具,如log4j,它允许您使用多个appender.use
System.setOut
,使用您自己的自定义流,跟踪接收到的任何内容。但这不是一个好的模式,我认为“我不能将整个控制台重定向到我的文件,因为我需要能够从用户那里获得控制台输入。”我将这解释为也需要向控制台显示。如果在获取用户输入时使用某些特定字符,请尝试以下代码javac{Programe_name}.java&java{Programe_name}>{Output_file_name>}&findstr{patter}{Output_file_name}>Output_file2.txt是否有任何方法可以将其配置为同时显示用户插入控制台的输入?目前,该输入被忽略。我知道我可以使用Scanner类从命令行获取输入,但输出文件中似乎没有包含该输入。