从另一个类中读取System.out.println(Text)

时间:2010-11-18 12:38:03

标签: java input java.util.scanner

基本上我正在创建一个应该从另一个类读取一系列整数的类。

另一个类是System.out。按以下顺序打印整数:

i i i i
i i i i
... etc.

所以我基本上想要创建一个String文件或者其他任何工作,我可以在第一个类中读取这个输出。

我很丢失,我不知道是否应该创建一个Scanner(System.in),如果是的话,该如何处理它。

我想这是一个非常开放的问题,所以请提前道歉。

3 个答案:

答案 0 :(得分:1)

重定向System.out是一种解决方案,但是会为所有类重定向System.out - 您不能(轻松)重新定向这一类专属。

也许这个“其他类”在您的控制之下,您可以将其视为重组代码的机会。所以也许你有类似的东西:

public void print(int[] values) {
  // ...
  System.out.println(result);
}

然后您可以将代码更改为

public String prepareResult(int[] values) {
  // ...
  return result;
}

public void print(int[] values) {
  System.out.println(prepareResult(values));
}

如果需要String中的输出,则调用“prepareResult”方法。

答案 1 :(得分:1)

基本上我同意那些实际上说你的设计应该改变而且“其他类”应该只准备结果并将其返回的人。

但如果这个“其他班级”不在你的控制范围内,我会建议你以下。

  1. 使用System.setOut()将stdout发送到特殊流。
  2. 实现以下特殊流: 它应该获得堆栈跟踪并发现它的调用位置。如果它被称为形式 “其他类”做一些事情来通知它(将数据写入特殊队列等) 否则只需打印到stdout。
  3. 如果您不熟悉API,可以使用以下提示来帮助您实现它。

    • new Throwable()。getStackTrace()[0] .getClassName()返回调用此代码的类。
    • 实现自己的outptut流也很简单。

    public class FilterOutputStream extends OutputStream {
        private OutputStream payload;
        public FilterOutputStream(OutputStream payload) {
            this.payload = payload;
        }
    
        public void write(int b) throws IOException {
            if (isSpecialClass()) {
                specialWrite(b);
            } else {
                payload.write(b);
            }
        }
        public void flush() throws IOException {
              payload.flush();
        }
        public void close() throws IOException {
             payload.close();
        }
        public boolean isSpecialClass() {
                return "MySpecialClass".equals(new Throwable().getStackTrace()[0].getClassName());
        }
    
    }
    

    我没有尝试这段代码,所以它可能包含甚至语法错误,但它说明了一般的想法。我希望这有帮助。

答案 2 :(得分:0)

您可以使用System.setOut()和System.setErr()在不同的流上重定向标准输出(然后将该流传输到您的输入)。