【问题标题】:Printing NUL in log file while Converting Char Arrays to String将字符数组转换为字符串时在日志文件中打印 NUL
【发布时间】:2020-12-29 14:02:40
【问题描述】:

我正在读取来自 TCP 调用的响应,我只需要读取字符。读取每个字符需要太多时间,所以我正在创建响应可能是最大数量的数组。这种方法的问题是响应长度较小且数组大小较大。在将其转换为字符串时,它还使用那些在读取响应时未使用的空白字符,因为它将“NUL”写入日志文件。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class TestArrayToString {

    public static void main(String[] args) throws IOException { 
        char[] chars = new char[5];
        chars[0] = 'K';
        chars[1] = 'S';
        chars[2] = 'H';
        String s = new String(chars);
        System.out.println(s);
        FileWriter fw = new FileWriter(new File("C://projects//test//test.log"));
        fw.write(s);
        fw.flush();
        fw.close();
    }
}

输出

是否有可能在写入时删除该 NUL。

【问题讨论】:

  • 您应该知道字节数组中有效的字符数。可以使用String​(byte[] bytes, int offset, int length)构造函数转换成字符串。
  • 为什么你必须只阅读字符?如果 TCP 数据包含换行符,您可以使用 BufferedReader 并使用 readLine()。

标签: java arrays string


【解决方案1】:

数组是对象。当它们被初始化(实例化)时,数组的每个元素都被初始化为其默认值。例如,原始数值初始化为数字 0。对象默认初始化为 NULL。字符原语或 char 被初始化为 Unicode 值 0 (\U0000),恰好是空字符。

您的代码正在初始化一个由五个字符组成的数组。只有前三个元素设置了新的字符值。最后两个仍然包含默认值。

要解决此问题,您要么需要创建一个较小的数组,要么只转换为不包含空值的字符串字符。一个简单的方法是修剪。这样的事情应该可以工作:

char[] chars = new char[5];
...
String s = String.valueOf(chars).trim();

更新

此解决方案的另一个额外好处是避免为重复值创建新的String

String s = new String(chars); // BAD
String s = String.valueOf(chars); // Preferred

如果字符数组表示的值不存在于字符串池中,首选答案只会创建一个新字符串。如果是,它使用已经存在的字符串。 String 复制构造函数创建一个重复的字符串(它忽略字符串池)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多