2012-10-05 38 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

相關問題