将byte []转换为String并返回

时间:2017-11-10 13:25:36

标签: java arrays pdf

我正在尝试在json中保存pdf文件的内容,并考虑将pdf保存为从byte []转换的String值。

    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

两个String相等,而两个byte[]不相等。为什么这样以及如何在json中正确转换/保存pdf?

2 个答案:

答案 0 :(得分:3)

从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

答案 1 :(得分:0)

为什么

如果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映射之外的任何内容,特别是byteStringsecondString相等。

如何在json中正确转换/保存pdf?

正如@mammago在评论中解释的那样,

  

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