如何以高效的方式从大字节数组文件中获取图像?

时间:2016-11-17 07:30:01

标签: java android performance multipart

好的,所以我正在创建一个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的开头和结尾。这会导致一些图像被跳过并花费很长时间。

有关如何获取图像的任何想法?我不知道是否有更简单的方法可以做到这一点,我不知道。

0 个答案:

没有答案