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

如何在Java中将InputStream转换为字符串到字节数组?,java,string,bytearray,inputstream,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Ä“Õ¿

在我的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--
这种方式非常快,但字节数组似乎已损坏。我无法从该字节数组创建图像文件。。。某些字符转换错误


也许有人可以帮忙?

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

String str = org.apache.commons.io.IOUtils.toString( inputStream );
尝试将随机字节转换为Unicode字符,然后再转换回相同的随机字节是行不通的

实现这一点的唯一方法是分阶段读取输入,而不是将其全部读入字符串

  • 从InputStream中读取,直到确信已越过HTTP边界线
  • 将流的其余部分读入字节数组(也可以使用
    IOUtils

  • 您可能不想将
    字节
    转换为
    字符
    ,这样会破坏您的字节,因为字节流与任何编码都不对应

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

    请注意,
    IOUtils.toByteArray
    在流结束之前不会停止。这对于HTTP 1.0来说应该没问题,但对于HTTP 1.1来说则会中断,因为HTTP 1.1可以在同一个流上发送多个请求。在这种情况下,您必须增量读取以查找
    内容长度
    字段,这样您就知道要读取多少
    输入流

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