1

SimpleDiskCache コード ( github リンク) を使用して、作業中の Android アプリ用にいくつかのビデオ ファイルをディスクにキャッシュしています。ビデオファイルをキャッシュに入れる方法は次のとおりです。

OutputStream  fil =  videoCache.openStream(newData.getObjectId().toLowerCase());
fil.write(videoInBytes);
fil.flush();
fil.close();

そして、キャッシュからビデオファイルを取得するコードは次のとおりです。

InputStream in = videoCache.getInputStream(newData.getObjectId().toLowerCase()).getInputStream();
File videoFile = Utils.createFile(Utils.TYPE_VIDEO_FILE);
OutputStream os = new FileOutputStream(videoFile);
IOUtils.copy(in, os);
os.close();
in.close();

唯一の問題は、IOExption: read failed: EBADF (Bad file number) が発生することです。スタック トレースは次のとおりです。

06-29 18:47:21.422: W/System.err(19393): java.io.IOException: read failed: EBADF (Bad file number)
06-29 18:47:21.422: W/System.err(19393):    at libcore.io.IoBridge.read(IoBridge.java:442)
06-29 18:47:21.430: W/System.err(19393):    at java.io.FileInputStream.read(FileInputStream.java:179)
06-29 18:47:21.430: W/System.err(19393):    at java.io.InputStream.read(InputStream.java:163)
06-29 18:47:21.430: W/System.err(19393):    at com.google.api.client.util.ByteStreams.copy(ByteStreams.java:51)
06-29 18:47:21.430: W/System.err(19393):    at com.google.api.client.util.IOUtils.copy(IOUtils.java:87)
06-29 18:47:21.430: W/System.err(19393):    at com.google.api.client.util.IOUtils.copy(IOUtils.java:56)
06-29 18:47:21.430: W/System.err(19393):    at com.licenta.mementoapp.datafragments.VideoFragment$1.done(VideoFragment.java:151)

誰かが私が間違っていることを知っていますか? ありがとう!

4

1 に答える 1

2

入力ストリームが使用される前に閉じられているようです。59 行目の snapshot.close() 呼び出しをコメント化し、完了したら自分で入力ストリームを閉じる必要があります。

public InputStreamEntry getInputStream(String key) throws IOException {
    DiskLruCache.Snapshot snapshot = diskLruCache.get(toInternalKey(key));
    if (snapshot == null)
        return null;

    try {
        return new InputStreamEntry(snapshot, readMetadata(snapshot));
    } finally {
        //snapshot.close();
    }
}
于 2013-07-29T04:00:09.990 に答える