如何在Java中将InputStream转换为字符串到字节数组?

时间:2012-10-05 00:09:27

标签: java string bytearray inputstream

在我的java服务器上,我从iOS客户端获得一个InputStream,如下所示:

--0xKhTmLbOuNdArY
Content-Disposition: form-data; filename="Image001"
Content-Type: image/png

âPNG
IHDR���@���@���™iqfi���gAMA��Ø»7äÈ���tEXtSoftware�Adobe ImageReadyq…e<��IDATx⁄‰;iê]Uôflπ˜Ω◊Ø;ΩB::õY
ê6LÄ“Õ¿
... etc. ...
≠Yy<‘_˜øüYmc˚æØ…ægflóÏK$å±çe0ˆΩleIë¢êH¢Tñê–Üd
≠≤§àä6D¸>˙÷˜˚<øÁ˘˝˜˚º^sÁ=Áû{ÓπÁ‹œπ˜úÄÎ:!44¡@
--0xKhTmLbOuNdArY--

第一行和最后一行是我的HTTP边界。第2行和第3行是有关图像文件的信息。从第5行到倒数第二行,我需要一个图像文件作为字节数组。

那么如何将图像信息作为String获取,将图像文件作为InputStream中的字节数组? 解决方案应该快速有效(文件大小可以是几兆字节/ <10 MB)。

我的方法:

我将InputStream转换为String,然后将其拆分并将第二个String转换为byte array ...

String str = org.apache.commons.io.IOUtils.toString( inputStream );
String[] strArray1 = str.split( "\r\n\r\n", 2 );
byte[] bytes = strArray1[1].getBytes();

这种方式非常快,但字节数组似乎已损坏。我无法从该字节数组创建图像文件...某些字符被错误地转换。

也许有人可以提供帮助?

2 个答案:

答案 0 :(得分:1)

您的代码中断的原因是第一行:

String str = org.apache.commons.io.IOUtils.toString( inputStream );

尝试将随机字节转换为Unicode字符,然后再转换回相同的随机字节,不会起作用。

你能做到这一点的唯一方法是分阶段阅读输入,而不是全部读入字符串。

  1. 从InputStream中读取,直到您确信自己已超越HTTP边界线。
  2. 将流的其余部分读入字节数组(您也可以使用IOUtils)。

答案 1 :(得分:1)

您可能不希望将bytes转换为char并返回,这会破坏您的字节,因为字节流与任何编码都不对应。

我会使用byte[]IOUtils.toByteArray的形式阅读整个内容,然后在该数组中查找字节序列"\r\n\r\n".getBytes()

请注意,IOUtils.toByteArray在流结束前不会停止。这应该适用于HTTP 1.0,但会破坏HTTP 1.1,它可以在同一个流上发送多个请求。在这种情况下,您必须逐步阅读以查找Content-Length字段,以便了解要阅读的InputStream的数量。