java8 println() 奇怪的问题

2021-11-01 11:43:35 +08:00
 vanishxiaoma

String s = "aaaaaaa\r"; System.out.println(s +"=");

设想会打印: aaaaaaa '='

实际打印的是: '='

有人知道为啥吗

打印的是没有单引号的,不知道为啥,直接写等号不能显示

猜想: 是因为字符串 s 中含有\r 自动回车了,但是没有换行。所以光标还是在当前行 打印=时是在本行开头位置打印,最后才是 newline 如有不对请指教

1871 次点击
所在节点    Java
12 条回复
monkeyWie
2021-11-01 11:44:41 +08:00
你猜的没毛病,\r 就是用来清空终端一行内容的
Vegetable
2021-11-01 11:51:45 +08:00
实际打印的应该是=aaaaaa 吧?

因为 /r 是回到行首,又打印了=,第一个 a 被=覆盖了。
这个打印方式最常见的就是原地输出进度。

for (int i = 0; i < 100; i++) {
TimeUnit.SECONDS.sleep(1);
System.out.print(String.format("\r%d%%", i));
}


@monkeyWie 说的不准确,/r 并不会清空内容,只会移动 cursor ,我不确定为什么你后边的 a 没了,没道理啊,是因为 windows 吗?
AoEiuV020
2021-11-01 12:20:51 +08:00
这种问题和终端有关,和代码无关,就看终端是否支持\r 回车,
vanishxiaoma
2021-11-01 12:34:07 +08:00
@Vegetable 是 windows 的
bonjourcs
2021-11-01 17:21:38 +08:00
\r 是回车符( carriage return ,参考打字机的回车)。在终端显示的时候,回车会将光标移到行首。所以你调用 Java 的 println 方法时, 「 aaaaaaa 」 会先被一个光标覆盖,然后再显示「=」。也就是 @monkeyWie 表达的「清空终端一行内容」。但是这种「清空」只是视觉上的,本质上这个字符串的长度还是 「 aaaaaaa=」的长度。
chengyiqun
2021-11-01 22:47:12 +08:00
https://tupian.li/images/2021/11/01/image5cbe907ec9f638db.png

我这儿是正常的, 说下你系统版本, 和 jdk 版本, oracle 的还是 open 的, open 的是哪家的, 说不定是 bug.
vanishxiaoma
2021-11-02 08:03:05 +08:00
@chengyiqun 系统 win10 oracle jdk 1.8
chengyiqun
2021-11-02 09:09:13 +08:00
@vanishxiaoma jdk 1.8 升级到最新了么?
openjdk 是 8u312
oraclejdk 是 8u311
bonjourcs
2021-11-02 09:58:14 +08:00
是我理解错了,回车符号是将光标移至行首,然后执行替换插入后续字符串。 @chengyiqun 正解。
回车符会覆盖之前的内容是 IntelliJ IDEA 上会出现的 "bug",这个 bug 在 Eclipse 里也出现过。相关链接:IntejjiJ : https://youtrack.jetbrains.com/issue/PY-33627?_ga=2.109889036.880141845.1635816502-1211060100.1635411421 Eclipse: https://bugs.eclipse.org/bugs/show_bug.cgi?id=76936
chengyiqun
2021-11-02 11:35:49 +08:00
@bonjourcs 原来如此, 我从来没在 idea 里写过类似的代码, 所以不知道这个. 这个怎么解决呢? idea 2021.2.3
chengyiqun
2021-11-02 11:36:26 +08:00
@bonjourcs 就是说是 idea 运行的终端自己的行为问题导致的了?
bonjourcs
2021-11-02 13:34:51 +08:00
@chengyiqun 我测试的情况看来是 IDEA 的问题。社区里并没有说怎么解决,PyCharm 倒是可以通过更改运行的 Emulate terminal in output console 解决,IDEA 这个问题现在还挂着呢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/812080

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX