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 に答える