有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ByteArrayOutputStream。toString()正在提供一个垃圾值

我有以下代码行:

private ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.writeTo(FILE);

由于对文件的某些限制,我们将把输出写入记录器,以便其他服务可以使用数据,因此我的代码更改为:

logger.info(baos.toString());

问题是它也给出了一些垃圾值,并且两个代码的输出不一样。我如何确保baos.toString()将给我与baos.writeTo(FILE)相同的结果

以下是快照: 普雷斯托·克雷洛格。日志显示输出boas.toString()并检查。记录baos.writeTo(FILE);

编写代码

private SpecificDatumWriter<UQLMetrics> datumWriter = new SpecificDatumWriter<>(Metrics.getClassSchema());
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
private BinaryEncoder encoder =  EncoderFactory.get().binaryEncoder(baos, null);
datumWriter.write(metrics, encoder);
encoder.flush();

presto-querylog.log shows output boas.toString()


共 (2) 个答案

  1. # 1 楼答案

    这可能与文件使用的^{}编码有关,而系统默认值(^{})由^{}用于创建字符串

    对两者使用相同的字符集,您将获得相同的输出

    ^{}不知道有关字符集的信息。它处理二进制数据

    可以使用^{}指定用于创建流中字符串的字符集。 字符集应该是您的数据编码中的任何一个

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    FileOutputStream file = ...;
    baos.writeTo(file);
    
    Charset charset = ...; // Whichever charset the string from which `baos` was produced is encoded in
    logger.info(baos.toString(charset));
    
  2. # 2 楼答案

    方法toString()使用平台的默认字符集将缓冲区的内容转换为字符串解码字节。这不是你想要的

    您需要知道将信息写入输出流的字符集,然后使用方法public String toString(String charsetName),以便使用正确的字符集构造字符串

    在过去,当诊断编码问题时,这个实用程序对我帮助很大。它是一个转换器,可以将任何字符串转换为Unicode序列,反之亦然。它是我的开源MgntUtils库的一部分

    下面是一个代码示例:

    String result = "Hello World";
    result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
    System.out.println(result);
    result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
    System.out.println(result);
    

    产出将是:

    \u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
    Hello World
    

    因此,我建议您将试图编写的文本作为字符串,并将其转换为Unicode序列。然后检查序列是否与正在写入的字节相同。如果它们是相同的,那么您使用的是UTF-8

    下面是类StringUnicodeEncoderDecoder的Javadoc。该库可以作为Maven工件here获得,也可以通过源代码和Javadoc在GitHub上获得