4

以下のコードスニペットをご覧ください

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadFile {


    public static void main(String[] args)  {

        String str="";
        FileReader fileReader=null;

        try{


            // I am running on windows only  & hence the path :) 
            File file=new File("D:\\Users\\jenco\\Desktop\\readme.txt");
            fileReader=new FileReader(file);
            BufferedReader bufferedReader=new BufferedReader(fileReader);
            while((str=bufferedReader.readLine())!=null){
                System.err.println(str);
            }

        }catch(Exception exception){
            System.err.println("Error occured while reading the file : " + exception.getMessage());
            exception.printStackTrace();
        }
        finally {
            if (fileReader != null) {
                try {
                    fileReader.close();
                    System.out.println("Finally is executed.File stream is closed.");
                } catch (IOException ioException) {

                    ioException.printStackTrace();
                }
            }
        }

    }

}

コードを複数回実行すると、次のようにランダムに出力されます。コンソールでSystem.outステートメントが最初に出力される場合もあれば、System.errが最初に出力される場合もあります。以下は私が得るランダムな出力です

出力1

Finally is executed.File stream is closed.
this is a text file 
and a java program will read this file.

出力2

this is a text file 
and a java program will read this file.
Finally is executed.File stream is closed.

なぜそうなのですか?

4

3 に答える 3

6

これは、2つの異なる出力に書き込んでいるためだと思います(1つは標準出力で、もう1つは標準エラーです)。これらは、Javaの実行中に両方に書き込むことができるように、実行時に2つの異なるスレッドによって処理される可能性があります。これが事実であると仮定すると、CPUタスクスケジューラは毎回同じ順序でスレッドを実行することはありません。

すべての出力が同じ出力ストリームに送られる場合(つまり、すべてが標準出力になるか、すべてが標準エラーになる場合)、この機能を取得することはできません。標準エラーと標準出力の実行順序が保証されることはありません。

于 2012-09-26T04:32:39.393 に答える
1

System.outとSystem.errはどちらも、あなたのケースではコンソールを指しているからです。

例として、println()の後にSystem.out.flush()とSystem.err.flush()を追加すると、出力は一貫したものになります。

于 2012-09-26T05:15:49.677 に答える
0

これはすでにここで答えられています:

Java:System.out.printlnとSystem.err.printlnの順序が正しくありません

これは、finally句がSystem.outを使用していて、他のコードがSystem.errを使用しているために発生します。エラーストリームは、アウトストリームの前にフラッシュアウトされます。その逆も同様です。

その結果、印刷​​されたデータの順序は、それが呼び出されたのと同じ順序で出力されることが保証されません。

後で検査するために、いつでもコンソールでerrストリームをファイルに転送したり、出力ストリームをファイルに転送したりできます。または、コードを変更して、すべてをSystem.outに出力します。多くのプログラマーはerrを使用せず、コンソールとは別にerrをキャプチャしない限り、その有用性については議論の余地があります。

使い切るだけ!

何度も...

于 2012-09-26T05:06:10.200 に答える