web-dev-qa-db-ja.com

コンソールとテキストファイルへの書き込み

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

いくつかの回答の後、私の質問が明確ではなかったことがわかりました。申し訳ありません。コンソール出力をomt.txtテキストファイルに保存したい。コンソールに「Hello123」が印刷されている場合は、omt.txtファイルにもある必要があります。つまり、コンソールに印刷されているものはすべて、om.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");  
        }

    }

}
11
Anarkie

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

両方のストリームにデータを書き込みたいので、 TeeOutputStream from Apache Commons を使用してみてください。 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の結果もファイルに配置されます。

21
Pshemo

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

public final static PrintStream out

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

この行で、宛先を効果的に再チャネル化しました。

System.setOut(ps);

そのため、出力はコンソールに表示されなくなります。

1
Jops

その理由は :

The Java.lang.System.setOut()メソッドは、「標準」出力ストリームを再割り当てします。

したがって、System.out.printlnを使用すると、テキストファイルにのみ出力されます

したがって、テキストファイルとコンソールに印刷する場合は、次のことを試してください。

    FileOutputStream fos = new FileOutputStream(f);
    PrintStream ps = new PrintStream(fos);
    ps.println("THIS is what I see on the text file, but not on CONSOLE");
    System.out.println("THIS is what I see on the text file, but not on CONSOLE");

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

            ps.println("Testing");
            System.out.println("Testing");
        } 
1
Alya'a Gamal