Java字符串的奇怪行为

Java字符串的奇怪行为,java,string,Java,String,我遇到了这个程序,它的运行方式与预期不符 public class StringTest { public static void main(String[] args) { String s = "Hello world"; for(int i = 0 ; i < s.length() ; i++) { System.out.write(s.charAt(i));

我遇到了这个程序,它的运行方式与预期不符

public class StringTest
{
      public static void main(String[] args)
      {
           String s = "Hello world";
           for(int i = 0 ; i < s.length() ; i++)
           {
                System.out.write(s.charAt(i));
           }
      }
}  
公共类StringTest
{
公共静态void main(字符串[]args)
{
字符串s=“Hello world”;
对于(int i=0;i

如果我们认为它应该打印Hello world,但它什么也不打印。发生了什么事?有什么想法吗?提前感谢。

您需要:
系统输出打印(s.charAt(i))

按照
的说明编写

请注意,字节是按给定方式写入的;要编写将根据平台的默认字符编码进行翻译的字符,请使用print(char)或println(char)方法

正如在对您的问题的评论中所指出的,如果您确实希望使用
write()
,您需要
flush()


write(int)
不打印任何内容的原因是它只在
\n
上刷新流,并且当
autoFlush
为true时才刷新流

public void write(int b) {
    try {
        synchronized (this) {
        ensureOpen();
        out.write(b);
        if ((b == '\n') && autoFlush)
            out.flush();
        }
    }
    catch (InterruptedIOException x) {
        Thread.currentThread().interrupt();
    }
    catch (IOException x) {
        trouble = true;
    }
}

你忘了
flush()
。你是对的,但你没有解决主要问题:为什么用print()打印的字符最终会被刷新,而用write()打印的字符不会被刷新?@Jeremy:你添加的是正确的,但是如果你看代码,print(char)只调用write(String),它与write具有相同的行为(int)。所以我还是不明白……然后Jonathon回答:@ChrisJ这应该是一个注释,但要回答“为什么”:系统类初始化如下:new PrintStream(new BufferedOutputStream(fdOut,128),true)。它将自动刷新设置为true。@Jeremy和@Jonathon:我仍然不明白,因为print()使用write(),自动刷新行为似乎被编码到write()…那么为什么print()自动刷新,而不是write()呢?@ChrisJ你让我翻代码,因为你是对的,一开始它没有意义。我发现所有的
print
方法都调用一个特定的
write
方法来刷新流。其他
write
方法(每个
print
print方法调用的除外)不要冲洗水流。询问者使用的水流不会自动冲洗。@Jonation:谢谢你提到这一点。我也注意到了细微的不同,但我很匆忙,没有编辑我的答案。@ChrisJ:你的观察值得赞扬,而且非常有趣。