2
import java.io.PrintStream;
import java.util.Scanner;
public class OutputTest
{

    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        PrintStream out = new PrintStream(System.out); 
        while(true) 
        {
            int in = scan.nextInt();
            if(in == 0) break;
            System.out.println(in*in);
        }
        out.flush();
    }

}

私は、このプログラムが 1 行に 1 つずつ数字のリストを取得し、それがゼロに達したときにすべての四角形を 1 行に 1 つずつ出力することを期待しています。代わりに、入力した各数値を正方形でエコーするだけです。

理想的には、実際に次の行を含めます。

System.setOut(out);

次に、プログラムの残りの部分を通常どおりに書き込みます(最後のフラッシュを除く)が、これはすぐにエコーするという同じ結果になりました。

ただし、PrintStreamを aに変更すると、PrintWriter期待どおりに機能しましたが、拡張されていないSystem.setOutため実行できません。PrintWriterOutputStream

これが期待どおりに動作しないのはなぜですか?

4

1 に答える 1

2

ストリームまたはライターの flush() は、「フラッシュするものがあればフラッシュする」ことを意味します。ストリームまたはライター手動でフラッシュされる前にバッファリングするのは、予期された動作ではありません。出力ストリームをバッファリングされたストリームでラップすることもできますが、指定したバッファ サイズがいっぱいになるとフラッシュされます。あなたの場合の最も簡単な解決策は、 StringBuffer に書き込み、ゼロを受け取ったときにこれを出力することです。

于 2012-10-30T03:48:07.830 に答える