簡體   English   中英

從另一個類中讀取System.out.println(Text)

[英]Reading System.out.println(Text) from another class

基本上我正在創建一個應該從另一個類讀取一系列整數的類。

另一個類是System.out。按以下順序打印整數:

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

所以我基本上想要創建一個String文件或其他任何工作,我可以在第一個類中讀取此輸出。

我很丟失,我不知道我是否應該創建一個Scanner(System.in),如果是,那該怎么辦呢。

我想這是一個非常開放的問題,所以請提前道歉。

重定向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. 使用System.setOut()將stdout發送到特殊流。
  2. 實現這個特殊的流如下:它應該獲得堆棧跟蹤並發現它的調用位置。 如果它被調用形式,“其他類”做一些事情來通知它(將數據寫入特殊隊列等)否則只需打印到stdout。

如果您不熟悉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());
    }

}

我沒有嘗試這個代碼,所以它可能包含甚至語法錯誤,但它說明了一般的想法。 我希望這有幫助。

您可以使用System.setOut()和System.setErr()在不同的流上重定向標准輸出(然后將該流傳輸到您的輸入)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM