System.out没有刷新

时间:2016-10-29 03:17:11

标签: java system.out

我有一个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()不会导致它打印。

3 个答案:

答案 0 :(得分:1)

  

这听起来很像输出没有被刷新,因为它只有System.out.print有麻烦。

通常System.outSystem.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() 应该刷新任何缓冲的输出。

我建议问题实际上是在其他地方;例如由于某种原因,printflush来电没有发生。

你的一些问题也可能是由此造成的:

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