【发布时间】:2014-09-07 08:20:36
【问题描述】:
如果您使用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" 会自动在 java.lang.System 中刷新,但我只是想确保.
另外,请不要在 cmets 中说“你为什么不直接测试它?”因为这有点难以测试,因为您基本上是靠运气来查看流是否没有正确刷新。
谢谢!
编辑
答案:
如果没有异常,我想就用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 中刷新;他们仍然到处都是。
【问题讨论】:
-
“混杂”是什么意思?那么 stdout 和 stderr 会按照您在 Java 应用程序中写入它们的精确顺序出现在终端上吗? 该行为也会受到其他因素的影响,例如,IDE 控制台的行为可能与系统控制台不同。
-
您使用这些 sysout 和 syserr 打印做什么?将这段代码集中在一个位置是否更有意义,以便在一个地方进行flush()?如果这是用于日志记录,请考虑使用日志记录框架而不是重新发明轮子,例如java.util.logging.
-
打印出错误而不抛出异常
-
本质上,我正在写一堆文件,如果我无法写入特定文件,我
System.err.println("Could not write to file " + file.getAbsolutePath()); System.error.flush()并继续尝试写入其他文件。 -
有没有更好的方法来实现这一点?
标签: java system flush autoflush