Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 系统输出不冲洗_Java_System.out - Fatal编程技术网

Java 系统输出不冲洗

Java 系统输出不冲洗,java,system.out,Java,System.out,我有一个java应用程序,它通过扫描仪读取System.in获取输入,并通过System.out提供输出。扫描仪始终处于活动状态,在未通过终端使用Ctrl+C或在IDE中结束进程的情况下,扫描仪不会终止 我遇到了一些让我相信System.out没有正常冲洗的行为 在我的代码中有以下几行: System.out.print(",\\" + '\n'); System.out.print(" " + someString); (someString不包含换行符) 当我通过终端执行此代码时

我有一个java应用程序,它通过扫描仪读取System.in获取输入,并通过System.out提供输出。扫描仪始终处于活动状态,在未通过终端使用Ctrl+C或在IDE中结束进程的情况下,扫描仪不会终止

我遇到了一些让我相信System.out没有正常冲洗的行为

在我的代码中有以下几行:

System.out.print(",\\" + '\n');
System.out.print("     " + someString); 
(someString不包含换行符)

当我通过终端执行此代码时,空格和someString不会打印到终端。然而,在我的IDE控制台中,它是。(J)

如果我将第二条语句改为println而不是print,它可以正常工作,但它确实会在代码的一次执行和下一次执行之间追加一行,这在这里是不可行的。(也许有什么我可以做的马车返回?)

这听起来很像输出没有被刷新,因为只有System.out.print有问题。但是,在print语句之后添加System.out.flush()不会导致打印

假设您正在Windows中运行该程序,则 返回(
\r
)和换行(
\n
)需要一起添加到打印中 新行如下:

这听起来很像输出没有被刷新,因为它是唯一有问题的
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
在启用自动刷新的情况下初始化为缓冲


但是,在print语句之后添加
System.out.flush()
不会导致打印

你确定吗?
flush()
应该刷新任何缓冲输出

我认为问题其实在别的地方;e、 g.
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.
System.out.println()在执行后将光标放置到下一行。因此,您不需要添加“\n”。这可能就是为什么两行之间有一行空格

只要这样做:

System.out.println(",\\");
System.out.println("     " + someString); 

我不确定问题是什么,但是
System.out
没有指定它的自动刷新行为;因此,这取决于实施。显然,在您的特定设置中,IntelliJ和JAVA_HOME设置的任何东西(猜测用法)都不同。可能就是这样。我在windows和linux计算机上都尝试过同样的问题,它们都有相同版本的JDK。@Sudom82是否尝试添加我的答案中的“\r\n”?我已经验证了System.out.flush()是通过代码覆盖工具调用的。不过我会仔细检查一下。代码覆盖率工具不会给出正确的答案。它将告诉您该方法是在某个地方调用的,而不是在您感兴趣的特定位置调用的。(例如,当写新行时,flush方法在引擎盖下被调用。)好吧,我只运行了这个方法的一个测试,我的代码覆盖率工具用System.out.flush()显示了这一行;正在执行,以及前一行和后一行。我可能误解了,但如果是这样的话,我不知道该怎么做。好吧,就像我说的,一条新线会引发一股潮水。。。您正在输出一个换行符。更好的方法是使用调试器,并在
PrintStream.flush()方法上设置断点。这将告诉您实际调用
flush()
的位置和时间。我将尝试您的调试器建议。谢谢大家的帮助。如果我弄明白了,我会回去报告的。这不是重点。自动刷新是基于是否存在换行符(
“\n”
)而发生的。@StephenC我想他的问题是“someString不包含换行符”(如果从终端运行),因此添加\r\n应该可以解决问题。@javaguy刚刚尝试了您的建议,假设这些应该是第1行的双引号(否则会出现编译器错误)。不幸的是,它没有解决问题。在调用另一个新行(通过println或print('\n'))之前(如果有的话),someString仍然没有打印。这会打印所有输出,但在代码执行之间会添加一个空的新行,这对我来说不是一个好选项。
System.out.println(",\\");
System.out.println("     " + someString);