2012-10-05 37 views
1

在我的Java服务器我从iOS客户端的InputStream,它看起来像这样得到:如何将InputStream转换为字符串到Java中的字节数组?

--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行直到倒数第二行有我需要的图像文件作为字节数组。

那么如何从InputStream获取图像信息作为字符串和图像文件作为字节数组? 该解决方案应该快速高效(文件大小可以是几兆字节/< 10MB)。

我的方法:

我InputStream的转换为字符串,然后把它分解和转换的第二个字符串的字节数组...

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

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

也许有人可以帮忙吗?

回答

1

之所以你的代码是休息的第一行:

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

试图随机字节转换为Unicode字符,然后回到相同的随机字节,是行不通的。

您可以完成这项工作的唯一方法是通过分阶段读取输入,而不是将它全部读入字符串。

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

你可能不希望转换您的byteschar和背部,这将破坏你的字节的字节流不对应任何编码。

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

请注意IOUtils.toByteArray不停止,直到流结束。对于HTTP 1.0,这应该是正确的,但是会针对可以在同一个流上发送多个请求的HTTP 1.1进行中断。在这种情况下,您必须逐步阅读以找到Content-Length字段,以便知道要读取多少InputStream

相关问题