Java中的outputstream出乎意料的结果

Sex*_*ast 3 java io

我正在尝试一个简单的程序来打印字符.当我这样做:

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');
   }
} 
Run Code Online (Sandbox Code Playgroud)

我得到了预期的结果,即打印出ASCII字符集的可打印子集.但是,当我尝试类似的东西时:

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

我完全没有输出,而我期待z.如果没有循环,这个程序与上面的程序有什么不同?

Pet*_*rey 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');
Run Code Online (Sandbox Code Playgroud)

只打印

a
Run Code Online (Sandbox Code Playgroud)

我怀疑这种不一致是一个长期存在的错误,而不是一个功能(换句话说,它不会被修复).;)

这意味着你必须要么

System.out.flush();
Run Code Online (Sandbox Code Playgroud)

要么

System.out.write('\n');
Run Code Online (Sandbox Code Playgroud)

看到最后一行.