Java中的outputstream出乎意料的结果

时间:2013-01-08 11:16:41

标签: 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');
   }
} 

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

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

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

2 个答案:

答案 0 :(得分: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');

查看最后一行。

答案 1 :(得分:1)

可能写一个新行\n会刷新流。

在第二个程序中,您没有打印换行符,并且内容不会从流中刷新。所以你看不到输出。

请参阅:When/why to call System.out.flush() in Java