5

我目前正在编写一个应用程序,它读取我的资产文件夹中包含一堆图像的 zip 文件。我正在使用ZipInputStreamAPI 读取内容,然后将每个文件写入 my:Environment.getExternalStorageDirectory()目录。我一切正常,但是第一次运行应用程序将图像写入存储目录时速度非常慢。将图像写入光盘大约需要 5 分钟。我的代码如下所示:

ZipEntry ze = null;
ZipInputStream zin = new ZipInputStream(getAssets().open("myFile.zip"));
String location = getExternalStorageDirectory().getAbsolutePath() + "/test/images/";

    //Loop through the zip file
    while ((ze = zin.getNextEntry()) != null) {
         File f = new File(location + ze.getName());
          //Doesn't exist? Create to avoid FileNotFoundException
          if(f.exists()) {
             f.createNewFile();
          }
          FileOutputStream fout = new FileOutputStream(f);
          //Read contents and then write to file
          for (c = zin.read(); c != -1; c = zin.read()) {
             fout.write(c);
          }             
    }
    fout.close();
    zin.close();

读取特定条目的内容然后写入它的过程非常缓慢。我假设它更多地与阅读而不是写作有关。我读过您可以使用byte[]数组缓冲区来加快进程,但这似乎不起作用!我试过这个,但它只读取文件的一部分......

    FileOutputStream fout = new FileOutputStream(f);
    byte[] buffer = new byte[(int)ze.getSize()];
     //Read contents and then write to file
      for (c = zin.read(buffer); c != -1; c = zin.read(buffer)) {
            fout.write(c);
      }             
  }

当我这样做时,我只写了大约 600-800 个字节。有没有办法加快这个速度??我是否错误地实现了缓冲区数组?

4

2 回答 2

12

我找到了一个更好的解决方案来实现BuffererdOutputStreamAPI。我的解决方案如下所示:

   byte[] buffer = new byte[2048];

   FileOutputStream fout = new FileOutputStream(f);
   BufferedOutputStream bos = new BufferedOutputStream(fout, buffer.length);

   int size;

    while ((size = zin.read(buffer, 0, buffer.length)) != -1) {
            bos.write(buffer, 0, size);
        }
        //Close up shop..
        bos.flush();
        bos.close();

        fout.flush();
        fout.close();
        zin.closeEntry();

我设法将加载时间从平均大约 5 分钟增加到大约 5 分钟(取决于包中有多少图像)。希望这可以帮助!

于 2011-07-30T00:08:17.150 回答
0

尝试使用http://commons.apache.org/io/ 像:

 InputStream in = new URL( "http://jakarta.apache.org" ).openStream();
 try {
   System.out.println( IOUtils.toString( in ) );
 } finally {
   IOUtils.closeQuietly(in);
 }
于 2011-07-28T06:50:12.167 回答