我有一个java应用程序,它通过读取System.in的扫描仪获取输入,并通过System.out提供输出。扫描仪始终处于活动状态,除非通过终端使用Ctrl+C或在集成开发环境中结束进程,否则扫描仪不会终止。
我遇到了一些行为,让我相信System.out没有正确刷新。
在我的代码中有以下几行:
System.out.print(",\\" + '\n');
System.out.print(" " + someString); (someString不包含换行符)
当我通过终端执行这段代码时,空白和someString没有打印到终端。然而,在我的IDE控制台中,它是。(IntelliJ)
如果我将第二个语句改为println而不是print,它可以正常工作,但它确实会在代码的一次执行和下一次执行之间添加一个新行,这在这里是不可行的。(也许我可以用回车来做些什么?)
这听起来很像是输出没有被刷新,因为它是唯一有问题的System.out.print。但是,在打印语句后添加System.out.flush()并不会导致打印。
发布于 2016-10-29 11:26:44
这听起来很像输出没有被刷新,因为它是唯一有问题的
System.out.print。
通常,System.out和System.err的配置是不同的。(System.err通常不缓冲,而System.out通常缓冲。)但是,javadoc并没有指定这两个流的刷新行为。这可以解释(真实的)控制台和在IDE中运行的行为之间的差异。
下面是Java 8中流的初始化方式:
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
setIn0(new BufferedInputStream(fdIn));
setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding")));
private static PrintStream ewPrintStream(FileOutputStream fos, String enc) {
if (enc != null) {
try {
return new PrintStream(new BufferedOutputStream(fos, 128),
true, enc);
} catch (UnsupportedEncodingException uee) {}
}
return new PrintStream(new BufferedOutputStream(fos, 128), true);
}如您所见,System.out在启用自动刷新的情况下被初始化为buffered。
但是,在print语句后添加
System.out.flush()不会导致打印。
您肯定没有吗?flush()应该刷新所有缓冲的输出。
我认为问题实际上出在其他地方;例如,print或flush调用没有发生……出于某种原因。
您的一些问题也可能是由于以下原因造成的:
System.out.print(",\\" + '\n');正如@javaguy所指出的,换行符是特定于平台的行分隔符。在某些平台上,控制台需要一些不同的东西。通知控制台换行的最简单的独立于平台的方法是:
System.out.println(",\\");或者把它们放在一起:
System.out.println(",\\");
System.out.print(" " + someString);
System.out.flush(); // This is necessary ... and should work.发布于 2016-10-29 11:26:35
假设您在Windows中运行该程序,则需要同时添加回车符(
\r)和换行符(\n)以打印新行,如下所示:
System.out.print(",\\" + '\r\n');
System.out.print(" " + someString); 发布于 2016-10-29 11:27:14
System.out.println()在执行后将光标放到下一行。所以你不需要添加"\n“。这可能就是为什么行间有一行空格的原因。
只需执行以下操作:
System.out.println(",\\");
System.out.println(" " + someString); https://stackoverflow.com/questions/40315709
复制相似问题