2017-09-20 3 views
0

このゲームはFizzBu​​zzのように表示されていますが、異なる言葉が表示されています。結果をファイルに送信して同時に出力する方法

"Nardo"の結果を出力して(System.out.println)、同時に呼び出されるとファイル化する必要があります。

私はFizzBu​​zzゲームの2つのクラスを作成し、もう1つはファイルにテキストを送信しました。これは正しく動作しますが、私はそれをどのように組み合わせるのか分かりませんFizzBu​​zzクラス。

私はFizzBu​​zzにOutputToFileクラスを呼び出しましたが、続行する方法はわかりません。

1)ファーストクラス

public class BaroSello {  
    private OutputToFile outputfile = new OutputToFile(); 
    for(int i=1; i<input; i++){ 
     if ((i % 3 == 0 && i % 5 == 0)) 
      System.out.println("BaroSello"); 
     else if (i % 3 == 0) 
      System.out.println("Baro"); 
     else if (i % 5 == 0) 
      System.out.println("Sello"); 
     else if (i%7==0) 
     // here I need the output to file and to terminal 
      System.out.println("Nardo"); 
     else 
      System.out.println(i); 
    } 
} 

2)第二のクラス

public class OutputToFile { 

    public static void main(String[] args) { 
     try { 
      PrintStream myconsole = new PrintStream(new File("/Users/xxx/Desktop/output.txt")); 
      System.setOut(myconsole); 
      myconsole.println("hello"); 
     } catch (FileNotFoundException fx) { 

      System.out.println(fx); 
     } 
    } 
} 
+0

は、コンソールとにする書き込みのPrintStreamを拡張するクラスを書きますファイル。クラスのインスタンスでSystem.setOut()メソッドを使用します。 – NormR

+0

'System.out'(と' System.err')を比較的簡単に別の 'PrintStream'にリダイレクトすることができます。あなたが言うように、あなたはそれを2つの異なる場所に送信したいときです - [この例では( https://stackoverflow.com/questions/12945537/how-to-set-output-stream-to-textarea/12945678#12945678)は基本的に、GUIへの出力を印刷することを意図していますが、基本的な考え方は同じです。私はまた、どのようにこれを行うだけですべてのロギングAPIを見てみることを検討するだろう – MadProgrammer

答えて

0

以下のクラスを使用すると、2つのOutputStreamのに作るの呼び出しを分割します。

プログラムでは、ファイルからPrintStreamを作成するのではなく、まずFileOutputStreamを作成します。次に、FileOutputStreamとSystem.outから新しいSplitOutputStreamを作成します。 SplitOutputStreamを使用すると、1回の書き込みでFileOutputStreamとSystem.outの両方に書き込まれます。 PrintStreamをSplitOutputStreamにラップすることで、PrintStreamでprintlnを実行できるようになり、出力はファイルとSystem.outの両方に移動します。

import java.io.*; 

public class SplitOutputStream extends OutputStream{ 

    public static void main(String[] args) throws Throwable{ 
     SplitOutputStream split=new SplitOutputStream(
      new FileOutputStream("c:\\text.txt"), 
      System.out 
     ); 
     PrintStream splitPs=new PrintStream(split); 
     splitPs.println("some text"); 
     splitPs.flush(); 
     splitPs.close(); 

     //or (not both) 
     PrintWriter splitPw=new PrintWriter(split); 
     splitPw.println("some text"); 
     splitPw.flush(); 
     splitPw.close(); 
    } 


    OutputStream o1; 
    OutputStream o2; 
    public SplitOutputStream(OutputStream o1,OutputStream o2){ 
     this.o1=o1; 
     this.o2=o2; 
    } 
    @Override public void write(int b) throws IOException{ 
     o1.write(b); 
     o2.write(b); 
    } 
    @Override public void write(byte[] b,int off,int len) throws IOException{ 
     o1.write(b,off,len); 
     o2.write(b,off,len); 
    } 
    @Override public void flush() throws IOException{ 
     o1.flush(); 
     o2.flush(); 
    } 
    @Override public void close() throws IOException{ 
     o1.close(); 
     o2.close(); 
    } 
} 

それとも

PrintStream originalSysOut=System.out; 

    SplitOutputStream split=new SplitOutputStream(
     new FileOutputStream("c:\\work\\text.txt"), 
     originalSysOut 
    ); 
    PrintStream splitPs=new PrintStream(split,true); 

    System.setOut(splitPs); 

    System.out.println("some text"); 

上記のコードは、ファイルに出力するにSystem.outに変更を加えたオリジナルのSystem.out

+0

私はこのクラスをFizzBu​​zzアルゴリズムに呼び出すことができますか? –

+0

編集された回答を参照してください –

+0

私が理解していれば、_FizzBu​​zz_のクラスを変更せずに使用することができ、 'System.out.println'はファイルと端末に直接行きますか? リクエストに応じて、どのように選択できますか? 新しいクラスに接続するために_FizzBu​​zz_を変更する必要がある場合、どうすればできますか? –

関連する問題