Java PrintStreams的计时问题

Java PrintStreams的计时问题,java,eclipse,printstream,Java,Eclipse,Printstream,我使用的是EclipseIDE,有时,根据代码的不同,System.err输出比System.out输出要早打印。例如: public static void main(String[] args) { System.out.println("Regular text"); //1 System.err.println("Error text"); //2 } 有了这些代码,一切都很好。2在1之后打印。但是,添加一些

我使用的是EclipseIDE,有时,根据代码的不同,System.err输出比System.out输出要早打印。例如:

    public static void main(String[] args) {    
        System.out.println("Regular text"); //1
        System.err.println("Error text"); //2           
    }
有了这些代码,一切都很好。2在1之后打印。但是,添加一些额外的system.out语句会颠倒顺序:

    public static void main(String[] args) {    
        System.out.println("Regular text"); //1
        System.err.println("Error text"); //2

        //Additional printing stuff
        for(String s = "a";s.length() < 200; s = s.concat("" + (char)(s.charAt(s.length()-1)+ 1))){
            System.out.println(s);
        }

    }
publicstaticvoidmain(字符串[]args){
System.out.println(“常规文本”);//1
System.err.println(“错误文本”);//2
//附加印刷材料
对于(字符串s=“a”s.length()<200;s=s.concat(“+(char)(s.charAt(s.length()-1)+1))){
系统输出打印项次;
}
}
1在2之后打印


这是怎么可能的?

stderr
stdout
是两个不同的流,通常在刷新时打印。我预计会发生一些缓冲,这会影响冲洗。因此,每个流中的数据量将影响刷新和输出。

stderr
stdout
是两个不同的流,通常在刷新时打印。我预计会发生一些缓冲,这会影响冲洗。因此,每个流中的数据量将影响刷新和输出。

它们是单独的流,每个流都有自己的缓冲区。您写入一个流,然后该流被“复制”或写入控制台

你应该找到那个电话

System.out.flush()
System.err.flush()

将流刷新到实际设备(Eclipse控制台)并带来一些顺序的外观。

它们是单独的流,每个流都有自己的缓冲区。您写入一个流,然后该流被“复制”或写入控制台

你应该找到那个电话

System.out.flush()
System.err.flush()
将流刷新到实际设备(Eclipse控制台)并带来一些秩序的外观。

在某些操作系统(*特别是nix)上,标准输出流是缓冲的——也就是说,发送到它的任何内容在发送到终端/屏幕之前可能会停留一段时间。然而,标准错误通常不会被缓冲,或者在每次输出后自动刷新

System.out
System.err
只是Java用来表示这两个流的对象,因此,它们的行为往往与主机平台上的行为相同。但我不知道有什么特别说明他们必须这样做。

在某些操作系统(*特别是nix)上,标准输出流是缓冲的——也就是说,发送到它的任何内容在发送到终端/屏幕之前可能都会停留一段时间。然而,标准错误通常不会被缓冲,或者在每次输出后自动刷新


System.out
System.err
只是Java用来表示这两个流的对象,因此,它们的行为往往与主机平台上的行为相同。但我不知道有什么特别说明他们必须这样做。

谷歌快速搜索显示,同样的主题也在如此@Joseph我在问之前就这么进去了,没有结果。你的谷歌搜索技能非常出色。快速的谷歌搜索会显示出同样的主题@Joseph我在问之前就这么进去了,没有结果。你的谷歌搜索技能非常出色。所以你认为这种行为取决于JVM的实现?是的。和/或编译器和/或C++?用于构建它的运行时。和/或操作系统。和/或月亮的相位。不要依赖两个流之间的任何特定同步,除非您自己刷新它们。我只是说我所看到的;其他操作系统、虚拟机等在您负担不起的情况下会表现出不同的行为。我刚刚检查了系统类源代码。有两种方法
私有静态本机void setErr0(PrintStream err)
私有静态本机void setOut0(打印流输出)。但是,在某些情况下,这两个流都使用如下缓冲区进行修饰:
setErr0(newprintstream(newbufferedoutputstream(fdErr,128),true))(第1115行)。
系统输出是否缓冲?Eww.:P无论哪种方式,JVM都与编译器告诉它要链接的C运行时交互,后者与操作系统交互,后者与控制台交互。如果两个流同时关闭,则由这些层中的一个(或全部)层决定哪一组字节是第一个打印的。说“这是第一步”的唯一真正方法是自己冲洗溪流。或者,如果您需要按顺序打印内容,您可以选择一个流并打印到其中。:)这两个流在逻辑上是分开的,实际上无论如何都不需要同步。这是一个Perl风格的正则表达式/语句。它的意思是“replace.out with.err”(参考前面的注释)。因此,您认为这种行为取决于JVM实现?是的。和/或编译器和/或C++?用于构建它的运行时。和/或操作系统。和/或月亮的相位。不要依赖两个流之间的任何特定同步,除非您自己刷新它们。我只是说我所看到的;其他操作系统、虚拟机等在您负担不起的情况下会表现出不同的行为。我刚刚检查了系统类源代码。有两种方法
私有静态本机void setErr0(PrintStream err)
私有静态本机void setOut0(打印流输出)。但是,在某些情况下,这两个流都使用如下缓冲区进行修饰:
setErr0(newprintstream(newbufferedoutputstream(fdErr,128),true))(第1115行)。
系统输出是否缓冲?Eww.:P无论哪种方式,JVM都与编译器告诉它要链接的C运行时交互,后者与操作系统交互,后者与控制台交互。如果两个流同时关闭,则由这些层中的一个(或全部)层决定哪一组字节是第一个打印的。说“这是第一步”的唯一真正方法是自己冲洗溪流。或者,如果您需要按顺序打印内容,您可以选择一个流并打印到其中。:)这两个流是logica