我有一个java应用程序,它通过Scanner读取System.in获取输入,并通过System.out提供输出。扫描仪始终处于活动状态,如果不通过终端使用Ctrl + C或在IDE中结束进程,它不会终止。
我遇到了一些导致我认为System.out无法正常刷新的行为。
在我的代码中有以下几行:
System.out.print(",\\" + '\n');
System.out.print(" " + someString);
(someString不包含换行符)
当我通过终端执行此代码时,空格和someString不会打印到终端。但是在我的IDE控制台中,确实如此。 (的IntelliJ)
如果我将第二个语句更改为println而不是print,它可以正常工作,但它会在代码执行和下一个代码执行之间追加一个新行,这在这里是行不通的。 (也许我可以用回车来做什么?)
这听起来很像输出没有被刷新,因为它唯一的System.out.print有麻烦。但是,在print语句之后添加System.out.flush()不会导致它打印。
答案 0 :(得分:1)
这听起来很像输出没有被刷新,因为它只有
System.out.print
有麻烦。
通常System.out
和System.err
配置不同。 (System.err
通常不缓冲,System.out
通常是缓冲的。)但是,javadocs不指定任何流的刷新行为。这可以解释(实际)控制台与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
已初始化为已启用autoflush的缓冲。
但是,在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.
答案 1 :(得分:0)
假设您在Windows中运行该程序,则运输 返回(
\r
)和换行符(\n
)需要一起添加到打印中 新行如下:
System.out.print(",\\" + '\r\n');
System.out.print(" " + someString);
答案 2 :(得分:0)
System.out.println()将光标放在执行后的下一行。所以你不需要添加“\ n”。这可能就是为什么行之间有一行空间。
这样做:
System.out.println(",\\");
System.out.println(" " + someString);