首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.out未刷新

System.out未刷新
EN

Stack Overflow用户
提问于 2016-10-29 11:17:11
回答 3查看 3.7K关注 0票数 2

我有一个java应用程序,它通过读取System.in的扫描仪获取输入,并通过System.out提供输出。扫描仪始终处于活动状态,除非通过终端使用Ctrl+C或在集成开发环境中结束进程,否则扫描仪不会终止。

我遇到了一些行为,让我相信System.out没有正确刷新。

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

代码语言:javascript
复制
System.out.print(",\\" + '\n');
System.out.print("     " + someString); 

(someString不包含换行符)

当我通过终端执行这段代码时,空白和someString没有打印到终端。然而,在我的IDE控制台中,它是。(IntelliJ)

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

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

EN

回答 3

Stack Overflow用户

发布于 2016-10-29 11:26:44

这听起来很像输出没有被刷新,因为它是唯一有问题的System.out.print

通常,System.outSystem.err的配置是不同的。(System.err通常不缓冲,而System.out通常缓冲。)但是,javadoc并没有指定这两个流的刷新行为。这可以解释(真实的)控制台和在IDE中运行的行为之间的差异。

下面是Java 8中流的初始化方式:

代码语言:javascript
复制
    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()应该刷新所有缓冲的输出。

我认为问题实际上出在其他地方;例如,printflush调用没有发生……出于某种原因。

您的一些问题也可能是由于以下原因造成的:

代码语言:javascript
复制
System.out.print(",\\" + '\n');

正如@javaguy所指出的,换行符是特定于平台的行分隔符。在某些平台上,控制台需要一些不同的东西。通知控制台换行的最简单的独立于平台的方法是:

代码语言:javascript
复制
System.out.println(",\\");

或者把它们放在一起:

代码语言:javascript
复制
System.out.println(",\\");
System.out.print("     " + someString); 
System.out.flush();   // This is necessary ... and should work.
票数 2
EN

Stack Overflow用户

发布于 2016-10-29 11:26:35

假设您在Windows中运行该程序,则需要同时添加回车符(\r)和换行符(\n)以打印新行,如下所示:

代码语言:javascript
复制
System.out.print(",\\" + '\r\n');
System.out.print("     " + someString); 
票数 0
EN

Stack Overflow用户

发布于 2016-10-29 11:27:14

System.out.println()在执行后将光标放到下一行。所以你不需要添加"\n“。这可能就是为什么行间有一行空格的原因。

只需执行以下操作:

代码语言:javascript
复制
System.out.println(",\\");
System.out.println("     " + someString); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40315709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档