3

文字を印刷するための簡単なプログラムを試しています。私がこれを行うとき:

import java.io.*;

public class listit {

  public static void main(String[] args) {

    for (int i = 32; i < 127; i++) {
      System.out.write(i);
      // break line after every eight characters.
      if (i % 8 == 7) System.out.write('\n');
      else System.out.write('\t');
    }
    System.out.write('\n');
   }
} 

期待どおりの結果が得られています。つまり、ASCII 文字セットの印刷可能なサブセットが印刷されています。ただし、似たようなことを試すと:

import java.io.*;
public class listit {
public static void main(String[] args) {
int i = 122;
System.out.write(i);
}
}

zを期待していましたが、出力がまったく得られません。ループがないことを除いて、このプログラムは上記のプログラムとどう違うのでしょうか?

4

2 に答える 2

6

PrintStream は、自動フラッシュまたは改行でのフラッシュをサポートしています。

System.out では自動フラッシュが有効になっていますが、 System.out.write('A') の場合、改行を書いた場合にのみ自動フラッシュされます。注: System.out.write("A".getByte()) を実行すると、自動フラッシュされます。

PrintStream.write(int) 状態の Javadoc

指定されたバイトをこのストリームに書き込みます。バイトが改行で、自動フラッシュが有効になっている場合、flushメソッドが呼び出されます。

これは、自動フラッシュと改行の書き込みが必要であることを意味します。

注: PrintStream.print(char) の状態

これらのバイトは、write(int) メソッドとまったく同じ方法で書き込まれます。

これは、フラッシングが異なることを明確にするものではありません。自動フラッシュがあるか、新しい行を書き込むと、フラッシュされます。

System.out.print('a');
System.out.write('b');

ちょうど印刷します

a

この不一致は、機能ではなく長年のバグであると思われます (つまり、修正される予定はありません)。;)

これは、次のいずれかを行う必要があることを意味します

System.out.flush();

また

System.out.write('\n');

最後の行を表示します。

于 2013-01-08T11:20:04.327 に答える
1

おそらく、新しい行を書き込むと\nストリームがフラッシュされます。

2番目のプログラムでは、改行を出力しておらず、内容がストリームからフラッシュされていません。したがって、出力は表示されません。

参照: Java で System.out.flush() を呼び出すタイミングと理由

于 2013-01-08T11:22:37.997 に答える