System.out.println隐藏字符串

昨天开发的时候遇到一个坑,这个坑几乎浪费了我一整天时间,我甚至现在都不知道其原因。

开发环境

macOS Ventura 13.4

IntelliJ IDEA 2023.1.2

现象

我用java的各种httpclient获取网络上的一个文本文件,获取的文本文件的内容使用System.out.println打印出来仅显示最后一行。

遇到这个现象我原以为我写的代码有问题,我几乎试遍主流的http请求依赖结果几乎相同。

我所试用的依赖如下:

xml 复制代码
  <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.16</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.jodd</groupId>
            <artifactId>jodd-http</artifactId>
            <version>6.3.0</version>
        </dependency>

        <!-- Pull in as a traditional dependency -->
        <dependency>
            <groupId>com.konghq</groupId>
            <artifactId>unirest-java</artifactId>
            <version>3.14.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.12.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.14.3</version>
        </dependency>

苦思不得其解,为什么本应该有400多行的数据,我取到只剩最后一行,其他数据怎么会"隐藏"。

研究了一天没搞明白,总不能在一颗树上吊死,后来我就放弃,我使用Java调用 命令行工具curl间接的使用了功能。

然后这个事情就放一边不管了,随着项目的不断推进我无意中发现,其实数据一直都在只是有一部分数据没有被System.out.println打印出来。

复现

于是我简化了一下我的文件。文本内容如下:

然后我使用java代码读取这段文本,并输出结果:

通过调试也可以发现数据是完整的,就是打印出来缺失了。

结论

与是我自己创建一个文件,然后手动把文本复制粘贴过去。发现文件是可能正常打印的。

虽然在IDEA中两个文件打开是一样的,但是我在nvim中打开了两个文件出现不同点。

不能打印的文件:

可以打印的文件

看来可能是windows中的换行符导致的。

xml 复制代码
基于 DOS/Windows 的文本文件在每一行末尾有一个 CR(回车)和 LF(换行),而 UNIX 文本只有一个换行,即win每行结尾为\r\n,而linux只有一个\n如果win下的文档上传到linux,每行的结尾都会出现一个^M,(^M是ctrl+v,ctrl+m) 如果是单个文档的话,可以用vi打开,执行 :%s/^M//g 来去掉^M,

经测试我把这个^M删除掉,就可以正常打印了。

System.out.println不会打印 \r\r之前的信息

java 复制代码
 result = "这是我要隐藏的一行文本"+
                "\r\r"+
                "Hello";
        //打印文本数据
        System.out.println(result);

这段代码的执行结果

java 复制代码
Hello

如果只回车(\r),打印的东西会覆盖同行以前的内容;

然后我搜索了一下果然有这样的特性。只是我一直不知道。
https://www.cnblogs.com/coderxiaobai/p/13658238.html

相关文件下载

基本可以判断是这个文件里可能有什么手脚,我把这个文件和代码跟大家分享一下。
https://download.csdn.net/download/lxyoucan/88587951

总结

我写一些比较小的程序时,喜欢直接System.out.println打印日志来查看变量的值,长达10年之久了。没想到在这里还踩了坑了。

就这么一个小坑,足足浪费我几乎一整天的时间。

相关推荐
-指短琴长-30 分钟前
ProtoBuf速成【基于C++讲解】
android·java·c++
Cx330❀38 分钟前
《C++ 搜索二叉树》深入理解 C++ 搜索二叉树:特性、实现与应用
java·开发语言·数据结构·c++·算法·面试
爱吃烤鸡翅的酸菜鱼44 分钟前
深度解析《AI+Java编程入门》:一本为零基础重构的Java学习路径
java·人工智能·后端·ai
SimonKing1 小时前
被卖的Hutool出AI模块了!它如何让Java调用大模型变得如此简单?
java·后端·程序员
不穿格子的程序员1 小时前
从零开始刷算法-栈-字符串解码
java·开发语言
你不是我我1 小时前
【Java 开发日记】设计模式了解吗,知道什么是饿汉式和懒汉式吗?
android·java·开发语言
♡喜欢做梦2 小时前
Spring MVC 响应处理:页面、数据与状态配置详解
java·javascript·spring·java-ee
计算机学姐2 小时前
基于SpringBoot的公务员考试管理系统【题库组卷+考试练习】
java·vue.js·spring boot·后端·java-ee·intellij-idea·mybatis
HahaGiver6662 小时前
Unity与Android原生交互开发入门篇 - 打开Android的设置
android·java·unity·游戏引擎·android studio
Blossom.1182 小时前
把AI“贴”进路灯柱:1KB决策树让老旧路灯自己报「灯头松动」
java·人工智能·python·深度学习·算法·决策树·机器学习