0

如果您使用System.err.print("There was an error..."); System.error.flush();,您是否需要System.out在手前冲洗。我知道用System.out.print("bla");and编写System.error.print("bla");可能会导致未刷新的流混淆。

我假设您只需要在知道没有 aSystem.out.println();System.out.print("\n");因为 a"\n"自动刷新的情况下才需要这样做java.lang.System,但我只是想确定一下。

另外,请不要在评论中说“你为什么不测试它?” 因为这有点难以测试,因为您基本上是依靠运气来查看流是否没有正确刷新。

谢谢!

编辑

回答:

我想只要Logger.getLogger(Your_Class.class.getName()).log(Level.WHATEVER, "message");没有例外就使用。

-

如果你不相信我,sout 和 serr 会混淆...

证明(我刚做的课):

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);
            }
        }
    }

}

输出 :

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)

但是,如果您将 Test.java 转换为 jar 并运行java -jar file/to/jar/Test.jar pause,则不会出现不匹配的情况-正如某些人所说(因为这是大多数 ide 控制台中的问题)。

-

-

此外,我仍然无法Netbeans ide 中刷新两个不同的流;他们仍然到处都是。

4

2 回答 2

0

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

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

于 2014-07-16T17:52:22.843 回答
0

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

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

最终将导致“abc”、“\n”、“def”、“\n”以可能不正确的顺序打印。第一个换行符总是在“abc”之后打印,第二个换行符总是在“def”之后打印(由于同步)但是序列“abc”,“def”,“\n”,“\n”是可能的.

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

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

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

于 2014-12-09T09:50:21.880 回答