V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vanishxiaoma
V2EX  ›  Java

java8 println() 奇怪的问题

  •  
  •   vanishxiaoma · 2021-11-01 11:43:35 +08:00 · 1840 次点击
    这是一个创建于 1120 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    设想会打印: aaaaaaa '='

    实际打印的是: '='

    有人知道为啥吗

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

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

    12 条回复    2021-11-02 13:34:51 +08:00
    monkeyWie
        1
    monkeyWie  
       2021-11-01 11:44:41 +08:00
    你猜的没毛病,\r 就是用来清空终端一行内容的
    Vegetable
        2
    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
        3
    AoEiuV020  
       2021-11-01 12:20:51 +08:00
    这种问题和终端有关,和代码无关,就看终端是否支持\r 回车,
    vanishxiaoma
        4
    vanishxiaoma  
    OP
       2021-11-01 12:34:07 +08:00
    @Vegetable 是 windows 的
    bonjourcs
        5
    bonjourcs  
       2021-11-01 17:21:38 +08:00
    \r 是回车符( carriage return ,参考打字机的回车)。在终端显示的时候,回车会将光标移到行首。所以你调用 Java 的 println 方法时, 「 aaaaaaa 」 会先被一个光标覆盖,然后再显示「=」。也就是 @monkeyWie 表达的「清空终端一行内容」。但是这种「清空」只是视觉上的,本质上这个字符串的长度还是 「 aaaaaaa=」的长度。
    chengyiqun
        6
    chengyiqun  
       2021-11-01 22:47:12 +08:00
    https://tupian.li/images/2021/11/01/image5cbe907ec9f638db.png

    我这儿是正常的, 说下你系统版本, 和 jdk 版本, oracle 的还是 open 的, open 的是哪家的, 说不定是 bug.
    vanishxiaoma
        7
    vanishxiaoma  
    OP
       2021-11-02 08:03:05 +08:00
    @chengyiqun 系统 win10 oracle jdk 1.8
    chengyiqun
        8
    chengyiqun  
       2021-11-02 09:09:13 +08:00
    @vanishxiaoma jdk 1.8 升级到最新了么?
    openjdk 是 8u312
    oraclejdk 是 8u311
    bonjourcs
        9
    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
        10
    chengyiqun  
       2021-11-02 11:35:49 +08:00
    @bonjourcs 原来如此, 我从来没在 idea 里写过类似的代码, 所以不知道这个. 这个怎么解决呢? idea 2021.2.3
    chengyiqun
        11
    chengyiqun  
       2021-11-02 11:36:26 +08:00
    @bonjourcs 就是说是 idea 运行的终端自己的行为问题导致的了?
    bonjourcs
        12
    bonjourcs  
       2021-11-02 13:34:51 +08:00
    @chengyiqun 我测试的情况看来是 IDEA 的问题。社区里并没有说怎么解决,PyCharm 倒是可以通过更改运行的 Emulate terminal in output console 解决,IDEA 这个问题现在还挂着呢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5781 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:00 · PVG 11:00 · LAX 19:00 · JFK 22:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.