我正在尝试读取一个 PNG 文件,然后将数据作为对 HTTP 请求的响应发送出去。
当我将原始 PNG 文件重命名为 a.txt并在编辑器中打开它时,我看到内容是这样的
8950 4e47 0d0a 1a0a 0000 000d 4948 4452
0000 074c 0000 0632 0806 0000 00bc 541d
2300 0000 0467 414d 4100 00b1 8e7c fb51
9300 0000 2063 4852 4d00 0087 0f00 008c
0f00 00fd 5200 0081 4000 007d 7900 00e9
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试手动读取它并将其作为字符串存储在 Java 中时,我得到如下结果:
�PNG
???
IHDR??L??2???�T#???gAMA??��|�Q�??? cHRM??�??�??�R??�@??}y??�??<�??�s<�w??
/iCCPICC Profile??HÇ�wTT��Ͻwz��0�z�.0��. Qf�?�Ml��@DE�����H��b!(�`HPb0�ï
Run Code Online (Sandbox Code Playgroud)
结果,我在浏览器中收到错误消息,说图像格式错误。
看到输出包含一些可读的东西,比如“PNG”,我相信我在阅读时改变了编码。但是,我不知道如何让它保留“正确”的格式/编码。这是我尝试过的两种不同方法,这两种方法都会导致类似的破坏结果。
InputStream inputStream = NewWebserverLauncher.class.getClassLoader().getResourceAsStream(url);
if (inputStream == null) {
// todo: error
return "NO INPUT STREAM. Looked for \"" + url + "\"";
}
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
return result.toString();
Run Code Online (Sandbox Code Playgroud)
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
return sb.toString();
Run Code Online (Sandbox Code Playgroud)
非常感谢有关如何正确读取 PNG 的指示!
但是,当我尝试手动读取它并将其存储为 Java 中的字符串时
你不应该那样做。它只是不是文本。
非常感谢有关如何正确读取 PNG 的指示!
不要尝试像存储文本数据一样存储二进制数据。
您将数据复制到 a 的代码ByteArrayOutputStream大致正确 - 直到最后一行,当您将其转换为字符串时。不要那样做。toByteArray()改为打电话。
您在帖子开头显示的文本是字节的十六进制表示。你没有说你用什么打开它,但我怀疑它是一些专门用于编辑二进制文件的程序,或者识别你正在打开一个实际上不是文本的文件,尽管文件扩展名。
您写了一条评论,表明您使用的库只允许您发送字符串作为响应。如果确实如此,请使用不同的库。任何真正假设每个 HTTP 响应都是文本的库从根本上被破坏了,您可能会发现它还有许多其他问题。我会仔细看第一,但-你可能会发现那里有发送二进制数据的方式,而你只是还没有找到他们没有。您可能想发布一个新问题,专门针对“如何使用库 X 发送二进制响应?” 而不是关于如何将二进制数据视为字符串。
| 归档时间: |
|
| 查看次数: |
337 次 |
| 最近记录: |