【问题标题】:System.out to string [duplicate]System.out 到字符串 [重复]
【发布时间】:2019-04-17 12:37:33
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为这通常是不可能的。您可能需要编写自己的 println 函数来调用一些日志记录函数,并调用 System.out.println
  • 你应该使用合适的日志工具,比如 log4j,它允许你使用多个 appender。
  • System.setOut 与您自己的自定义流一起使用,以跟踪收到的任何内容。但这不是我认为的好模式

标签: java console


【解决方案1】:

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

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();
            }
        }
    }

所以你在控制台+文件中有输出,所有错误都在一个单独的文件中。

即使日志记录框架要好得多,但此解决方案的优势在于根本不需要更改代码。

PS:在多线程上下文中,还应该同步DoublePrintStream的方法

【讨论】:

  • 有什么方法可以配置它以显示用户插入控制台的输入?目前,输入被省略。
  • 我知道我可以使用 Scanner 类从命令行获取输入,但这似乎没有包含在输出文件中。
【解决方案2】:

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

javac {Programe_name}.java & java {Programe_name} > {输出文件名>}

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

javac World.java & java World > out .txt

【讨论】:

  • “我无法将整个控制台重定向到我的文件,因为我需要能够从用户那里获取控制台输入。” 我将此解释为显示的要求控制台也是。
  • 如果您在获取用户输入时使用某些特定字符,请尝试此代码 javac {Programe_name}.java & java {Programe_name} > {Output_file_name>} & findstr {patter} {Output_file_name} > Output_file2.txt
猜你喜欢
  • 2017-11-02
  • 2020-04-20
  • 2023-03-09
  • 2013-08-04
  • 1970-01-01
  • 2016-03-28
  • 2017-02-14
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多