Java 将字节[]转换为字符串并返回

Java 将字节[]转换为字符串并返回,java,arrays,pdf,Java,Arrays,Pdf,我试图将pdf文件的内容保存在json中,并考虑将pdf保存为从字节[]转换而来的字符串值 byte[] byteArray = feature.convertPdfToByteArray(Paths.get("path.pdf")); String byteString = new String(byteArray, StandardCharsets.UTF_8); byte[] newByteArray = byteString.getBytes(Standar

我试图将pdf文件的内容保存在json中,并考虑将pdf保存为从字节[]转换而来的字符串值

    byte[] byteArray = feature.convertPdfToByteArray(Paths.get("path.pdf"));

    String byteString = new String(byteArray, StandardCharsets.UTF_8); 

    byte[] newByteArray = byteString.getBytes(StandardCharsets.UTF_8); 

    String secondString = new String(newByteArray, StandardCharsets.UTF_8);


    System.out.println(secondString.equals(byteString));
    System.out.println(Arrays.equals(byteArray, newByteArray));
    System.out.println(byteArray.length + " vs " + newByteArray.length);
上述代码的结果如下:

true
false
421371 vs 760998

两个
字符串
相等,而两个
字节[]
不相等。这是为什么?如何在json中正确转换/保存pdf?

在读取pdf文件时,您可能使用了错误的字符集

例如,ISO-8859-1中不存在字符
é
e
带锐字符):

byte[] byteArray = "é".getBytes(StandardCharsets.ISO_8859_1);
String byteString = new String(byteArray, StandardCharsets.UTF_8);
byte[] newByteArray = byteString.getBytes(StandardCharsets.UTF_8);
String secondString = new String(newByteArray, StandardCharsets.UTF_8);

System.out.println(secondString.equals(byteString));
System.out.println(Arrays.equals(byteArray, newByteArray));
System.out.println(byteArray.length + " vs " + newByteArray.length);
输出

true
false
1 vs 3
为什么 如果
byteArray
确实包含PDF,则很可能是无效的UTF-8。因此,无论在哪里

String byteString = new String(byteArray, StandardCharsets.UTF_8);
如果遇到无效的UTF-8字节序列,它将用Unicode替换字符替换该字节序列。也就是说,此行会损坏您的数据,很可能无法修复。那么下面

byte[] newByteArray = byteString.getBytes(StandardCharsets.UTF_8);
不会产生原始字节数组,而是它的损坏版本


另一方面,
newByteArray
是UTF-8编码给定字符串的结果,
byteString
。因此,
newByteArray
是有效的UTF-8和

String secondString = new String(newByteArray, StandardCharsets.UTF_8);
不需要替换UTF-8映射之外的任何内容,尤其是
byteString
secondString
是相等的

如何在json中正确转换/保存pdf? 正如@mammago在评论中解释的那样


JSON不是二进制内容(如文件)的适当格式。您应该使用base64之类的东西从PDF中创建一个字符串,并将其存储在JSON对象中


JSON不是二进制内容(如文件)的适当格式。您应该使用base64之类的东西从PDF中创建一个字符串,并将其存储在JSON对象中。