在System.error.print(“”)之前是否需要System.out.flush();

时间:2014-07-16 17:23:49

标签: java system flush autoflush

如果您使用System.err.print("There was an error..."); System.error.flush();,您需要事先刷新System.out。我知道使用System.out.print("bla");System.error.print("bla");进行写作会导致未刷新的流混淆。

我假设您只需要知道没有System.out.println();System.out.print("\n");,因为"\n"会自动刷新{{} 1}},但我只想确定。

另外,请不要在评论中说出"为什么你不测试它?"因为你有点难以测试这个,因为你实际上是依靠运气来看看溪流是否不能正常冲洗。

谢谢!

修改

答案:

如果没有例外,我想只使用java.lang.System

-

如果你不相信我那个sout和serr混在一起......

证明(我刚刚上课):

Logger.getLogger(Your_Class.class.getName()).log(Level.WHATEVER, "message");

输出:

package test;

/**
 *
 * @author dylnmc
 */
public class Test {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            if (i % 2 == 0) {
                System.out.println(i);
            } else {
                System.err.println(i);
            }
        }
    }

}

如果你将Test.java变成jar并运行run: 0 1 3 2 4 6 8 10 12 14 16 18 5 7 9 11 13 15 17 19 BUILD SUCCESSFUL (total time: 0 seconds) java -jar file/to/jar/Test.jar,那么就没有错误了 - 正如有些人所说的那样(因为这是大多数ide控制台中的一个问题)。

-

-

另外,我仍然可以让两个不同的流在Netbeans ide中刷新;他们仍然到处都是。

2 个答案:

答案 0 :(得分:0)

System.outSystem.err是两种不同的数据流。写一个通常不会改变另一个。像Netbeans或Eclipse这样的IDE会同时读出和错误的流,并同时在控制台窗口中显示。从错误流中读取的数据可能会以红色突出显示。这使得输出看起来“混淆”了。

因此,System.out.flush()不会对System.err产生任何影响。相反,您可以考虑使用System.setOut,System.setErr将System.out重定向到单独的流,并在退出程序之前打印捕获的数据。

答案 1 :(得分:0)

System.out.println(String s)和System.err.println(String s)不是原子操作,因为它们首先打印字符串,然后打印换行符。原子性是相对的。这两个操作(打印字符串并打印换行符)位于同步块中,因此从Java代码的角度来看它们是原子的。但是,它们仍然是底层系统的两个独立操作。因此,如果控制台由err和out共享,则使用以下代码:

System.out.println("abc");
System.out.println("def");

最终将导致&#34; abc&#34;,&#34; \ n&#34;,&#34; def&#34;,&#34; \ n&#34;以可能不正确的顺序打印。第一个换行将始终打印在&#34; abc&#34;之后,第二个换行将始终打印在&#34; def&#34; (由于同步)但序列&#34; abc&#34;,&#34; def&#34; &#34; \ n&#34;,&#34; \ n&#34;是可能的。

为避免这种情况,请避免使用println:

System.out.print("abc" + "\n");
System.out.print("def" + "\n");

(当然,您应该为系统使用正确的行分隔符。)