2010-11-18 12 views
3

基本的に、別のクラスの一連の整数を読み込むはずのクラスを作成しています。他のクラスからSystem.out.println(テキスト)を読む

他のクラスには、次の順序で整数をSystem.out.printingさ:

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

だから私は基本的に私が最初にあるから、この出力を読み取ることができることを、文字列のファイルまたは任意の作品を作りたいですクラス。

私はかなり迷っています。私はScanner(System.in)を作成する必要があるかどうか、もしそうなら、それをどうすればいいのか分かりません。

私はこれがかなり開いた質問だと思うので、事前にお詫び申し上げます。

+0

宿題の全文をpastebin.comのようなサイトに投稿して、ここにリンクして見ていただけますか?それは私たちが与えるべきアドバイスの方向性を理解するのに役立ちます。 –

答えて

0

System.setOut()およびSystem.setErr()を使用して、標準出力を別のストリームにリダイレクトしてから、そのストリームを入力にパイプすることができます。

1

リダイレクトSystem.outは1つの解決策ですが、それはすべてのクラスに対してSystem.outをリダイレクトします。この1つのクラス専用にはリダイレクトできません。

この「他のクラス」はあなたのコントロール下にあるかもしれないし、コードを再構成するためにこれを相手にすることができます。

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

にコードを変更して、文字列で出力が必要な場合は、「prepareResult」メソッドを呼び出すことができますので、多分あなたのような何かを持っています。

1

基本的に私はあなたのデザインを変更しなければならないと言った人に同意します。「他のクラス」は結果を準備して返すだけです。

しかし、この「他のクラス」があなたのコントロール下にない場合は、以下のことをお勧めします。

  1. stdoutを特別なストリームに送るには、System.setOut()を使用します。
  2. この特別なストリームは、次のように実装します。 スタックトレースを取得し、呼び出し元を検出する必要があります。それがフォーム と呼ばれる場合は、「他のクラス」はそれを通知するために何かを行います(特別なキューなどにデータを書き込む) それ以外の場合はstdoutに出力してください。

APIに精通していない場合は、実装に役立つヒントをいくつかご紹介します。

  • 新しい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()); 
    } 

} 

それはおそらく、構文エラーが含まれているので、私は、このコードを試していないが、それは一般的な考えを示しています。私はこれが役立つことを願っています

+0

+1、良いアイデア。 "isSpecialClass"のテストはかなり遅いですが、パフォーマンスの高いプロダクションシステムはコンソールに印刷してはいけませんので、実際の問題ではないと思います。 –

関連する問題