12

インターネットから以下のコードを見つけましたが、機能しますが、印刷されたコンソールを omt.txt に書き込まずSystem.out.println、2 番目の catch ブロックの後にステートメントを書き込むだけです。コードを一度実行すると、私の意味が理解できます。コンソールにあるものをすべて「omt.txt」ファイルに書き込む必要があります...

いくつかの回答の後、私の質問が明確ではなかったことがわかりました。申し訳ありません。コンソール出力を omt.txt テキスト ファイルに保存したいと考えています。コンソールに "Hello 123" が出力された場合、それは omt.txt ファイルにもあるはずです。 1対1も同じ!

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class Wrt_file {

    public static void main(String[] args) {
        System.out.println("THIS is what I see on the console. but not on TEXT file"); 

          File f = new File("omt.txt");
          if(!f.exists())
          {
            try {
                       f.createNewFile();
                } catch (Exception e) {
                    e.printStackTrace();
                }
          }

        try {
                FileOutputStream fos = new FileOutputStream(f);
                PrintStream ps = new PrintStream(fos);
                System.setOut(ps);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("THIS is what I see on the text file, but not on CONSOLE");      

        for (int i=0; i<10; i++){

            System.out.println("Testing");  
        }

    }

}
4

4 に答える 4

23

OPがストリームを複製したいことを知った後、回答を更新しました

両方のストリームにデータを書き込みたいので、 Apache CommonsTeeOutputStreamから使用してみてください。2回目の試行でコードを変更してください

try {
    FileOutputStream fos = new FileOutputStream(f);
    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
        try {
            fos.flush();
        }
        catch (Throwable t) {
            // Ignore
        }
    }, "Shutdown hook Thread flushing " + f));
    //we will want to print in standard "System.out" and in "file"
    TeeOutputStream myOut=new TeeOutputStream(System.out, fos);
    PrintStream ps = new PrintStream(myOut, true); //true - auto-flush after println
    System.setOut(ps);
} catch (Exception e) {
    e.printStackTrace();
}

からの結果System.outもファイルに配置されるようになりました。

于 2013-04-26T13:52:03.250 に答える
1

ではSystem.java、これはoutプロパティの宣言です。

public final static PrintStream out

一度に 1 つの PrintSteam オブジェクトしかできないことがわかります。したがって、コンソールまたはファイルのいずれかですが、両方ではありません。

この行で、目的地を効果的に再チャネリングしました。

System.setOut(ps);

したがって、出力はコンソールに表示されなくなります。

于 2013-04-26T13:25:17.117 に答える