首页 > 解决方案 > Java:System.out.println 方法在打印字节数组时丢失了一些行

问题描述

我有一个字节数组,然后我通过字节数组创建一个新字符串,当我调试和评估字符串时,值是正确的。但是在我打印出来之后,它丢失了一些行。

    byte[] bytes = {50, 48, 49, 57, 45, 49, 48, 45, 50, 50, 32, 49, 55, 58, 52, 56, 58, 48, 52, 44, 51, 53, 56, 32, 73, 78, 70, 79, 32, 91, 104, 116, 116, 112, 45, 110, 105, 111, 45, 56, 48, 56, 53, 45, 101, 120, 101, 99, 45, 49, 93, 40, 69, 120, 101, 99, 117, 116, 101, 67, 111, 109, 109, 97, 110, 100, 46, 106, 97, 118, 97, 58, 54, 48, 41, 45, 32, 76, 97, 115, 116, 32, 108, 111, 103, 105, 110, 58, 32, 84, 117, 101, 32, 79, 99, 116, 32, 50, 50, 32, 49, 55, 58, 51, 56, 58, 51, 55, 32, 50, 48, 49, 57, 32, 102, 114, 111, 109, 32, 49, 48, 46, 50, 53, 51, 46, 55, 46, 50, 54, 13, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 95, 41, 13, 10, 32, 32, 95, 32, 32, 32, 95, 32, 95, 32, 95, 95, 32, 32, 95, 32, 32, 95, 95, 95, 32, 95, 95, 95, 32, 32, 95, 32, 95, 95, 32, 95, 95, 95, 13, 10, 32, 124, 32, 124, 32, 124, 32, 124, 32, 39, 95, 32, 92, 124, 32, 124, 47, 32, 95, 95, 47, 32, 95, 32, 92, 124, 32, 39, 95, 32, 96, 32, 95, 32, 92, 13, 10, 32, 124, 32, 124, 95, 124, 32, 124, 32, 124, 32, 124, 32, 124, 32, 124, 32, 40, 95, 124, 32, 40, 95, 41, 32, 124, 32, 124, 32, 124, 32, 124, 32, 124, 32, 124, 13, 10, 32, 32, 92, 95, 95, 44, 95, 124, 95, 124, 32, 124, 95, 124, 95, 124, 92, 95, 95, 95, 92, 95, 95, 95, 47, 124, 95, 124, 32, 124, 95, 124, 32, 124, 95, 124, 13, 10, 13, 10, 13, 10, 91, 122, 97, 105, 98, 101, 105, 64, 48, 49, 108, 49, 53, 98, 48, 48, 51, 32, 126, 93, 36, 32, 115, 115, 104, 32, 114, 111, 111, 116, 64, 49, 48, 46, 50, 51, 56, 46, 48, 46, 53, 52, 13, 10, 114, 111, 111, 116, 64, 49, 48, 46, 50, 51, 56, 46, 48, 46, 53, 52, 39, 115, 32, 112, 97, 115, 115, 119, 111, 114, 100, 58, 32, 13, 10, 76, 97, 115, 116, 32, 108, 111, 103, 105, 110, 58, 32, 84, 117, 101, 32, 79, 99, 116, 32, 50, 50, 32, 49, 54, 58, 53, 57, 58, 51, 48, 32, 50, 48, 49, 57, 32, 102, 114, 111, 109, 32, 49, 48, 46, 49, 55, 50, 46, 52, 57, 46, 49, 13, 13, 10, 91, 114, 111, 111, 116, 64, 122, 98, 110, 98, 117, 109, 97, 115, 117, 97, 116, 32, 126, 93, 35, 32, 98, 112, 114, 101, 115, 116, 111, 114, 101, 32, 45, 115, 32, 50, 48, 49, 57, 45, 49, 48, 45, 50, 50, 32, 49, 52, 58, 49, 48, 58, 53, 53, 32, 45, 101, 32, 50, 48, 49, 57, 45, 49, 48, 45, 50, 50, 32, 49, 52, 58, 49, 48, 58, 53, 53, 32, 45, 67, 32, 13, 32, 109, 97, 115, 116, 101, 114, 49, 32, 45, 68, 32, 109, 97, 115, 116, 101, 114, 49, 32, 47, 101, 116, 99, 47, 104, 111, 115, 116, 115, 13, 10, 91, 114, 111, 111, 116, 64, 122, 98, 110, 98, 117, 109, 97, 115, 117, 97, 116, 32, 126, 93, 35, 13, 10};
        String s = new String(bytes,"UTF-8");
        System.out.println(s);

当我调试和评估字符串 s 时,它包含:

[root@zbnbumasuat ~]# bprestore -s 2019-10-22 14:10:55 -e 2019-10-22 14:10:55 -C
master1 -D master1 /etc/hosts

但是当我打印出来它丢失了行并且只得到下面的结果:

master1 -D master1 /etc/hosts

所以任何人都可以帮我弄清楚发生了什么,这是jdk的错误吗?

我的 jdk 版本是

java 版本 "1.8.0_161" Java(TM) SE Runtime Environment (build 1.8.0_161-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

我让我的朋友运行代码,他得到了相同的结果。当我在一些在线java工具中运行时,结果还可以。

标签: java

解决方案


“新行”应该是

\r   (Mac) 
\n   (Linux) 
\r\n (Windows)

因为您使用的不是 Mac,如果控制台遇到独立的 \r,它会将光标移动到行首并覆盖上一行而不是创建新行。

您可以检查此代码的结果:

System.out.println("------------------------");
System.out.println(new String(new byte[]{'a', 13, 'b'}));
System.out.println("------------------------");
System.out.println(new String(new byte[]{'a', 10, 'b'}));
System.out.println("------------------------");
System.out.println(new String(new byte[]{'a', 13, 10, 'b'}));
System.out.println("------------------------");

结果:

------------------------
b
------------------------
a
b
------------------------
a
b
------------------------

那么,如何修复呢?只需删除独立的 \r 或将其替换为 \r\n (或 \n)


推荐阅读