好的,所以我正在创建一个Android应用程序,它接收包含多个PNG的大字节文件(Multipart / mixed type约100 MB)。我想将文件拆分为字节数组,以便将每个数组存储到相应的用户对象中。
这是我得到的文件示例:
--d9883f5d-2811-40b9-a635-1493f807f371
Content-Location: http://something.com/id/00001/
Content-Type: image/png
âPNG
IHDR†»‡
...
...
...
r˚º˝ ¯fi˛¸o˛É∑?ˇ¡€üġ‡ÌO¿ˆ'‡?x˚º˝ ¯fi˛¸o˛É∑?ˇ¡€üġ‡ÌO¿F”È/ø„œˆákt:˝ˇø=s—æsêIENDÆB`Ç
--c967ed34-6e3a-4d34-9dae-bb7bb81c4138
Content-Location: http://something.com/id/00002/
Content-Type: image/png
âPNG
IHDR†»‡
...
...
...
r˚º˝ ¯fi˛¸o˛É∑?ˇ¡€üġ‡ÌO¿ˆ'‡?x˚º˝ ¯fi˛¸o˛É∑?ˇ¡€üġ‡ÌO¿F”È/ø„œˆákt:˝ˇø=s—æsêIENDÆB`Ç
--c967ed34-6e3a-4d34-9dae-bb7bb81c4138
我实现图像提取的一种方法是使用扫描仪,但它只适用于Android棒棒糖及以上版本,在kitkat上我得到了一个OutOfMemoryError。这是代码:
Pattern pattern = Pattern.compile("(?=Content-Location.+?\\n+)", Pattern.UNIX_LINES);
scanner = new Scanner(fis, "x-MacRoman");
scanner.useDelimiter(pattern);
scanner.next();
while (scanner.hasNext()) {
String nextBm = scanner.next();
String pictureId = nextBm.split("/")[4];
String pictureSubString = nextBm.substring(nextBm.indexOf("PNG") - 1);
FileOutputStream os = new FileOutputStream(new File(context.getFilesDir().toString() + "/" + pictureId));
os.write(pictureSubString.getBytes("x-MacRoman"));
os.close();
}
然后我尝试使用BufferedStreamReader,但问题是当我调用方法readLine()时,无法知道换行符是否包含回车符,换行符或两者都有,所以字节永远不会被解码
我现在使用的方法非常低效:我使用FileInputStream逐字节读取文件,查找PNG的开头和结尾。这会导致一些图像被跳过并花费很长时间。
有关如何获取图像的任何想法?我不知道是否有更简单的方法可以做到这一点,我不知道。