0

コードに問題があります。URLからPDFを保存しようとしています。PDFはそこにありますが、その長さはゼロです。ただし、入力ストリームの長さは正しいです。PDF が正しく保存されないのはなぜですか?

これは、ストリームから PDF を保存するための実際のコードです。

    public void createExternalStoragePrivateFile
                            (String name, String extension, InputStream is) {
    // Create a path where we will place our private file on external
    // storage.
    File file = new File
                     (mContext.getExternalFilesDir(null), name +"."+extension);

    try {
        Log.d("", "before: " + file.getPath() + 
                             " " + file.getTotalSpace() + "  " + file.length());
        OutputStream os = new FileOutputStream(file);
        byte[] data = new byte[is.available()];
        is.read(data);
        os.write(data);
        is.close();
        os.close();

        Log.d("","after: " + file.getPath() + 
                              " " + file.getTotalSpace() + "  " + file.length());
    } catch (IOException e) {
        // Unable to create file, likely because external storage is
        // not currently mounted.
        Log.w("ExternalStorage", "Error writing " + file, e);
    }

出力は私にこれを与えます(長さは前後でゼロですが、後の合計スペースはゼロではありません。なぜ長さがゼロなのですか?

04-25 09:38:44.938: D/(4103): before: /storage/emulated/0/Android
                                  /data/what.to.use.myapp/files/Lolpdf.pdf 0  0

04-25 09:38:44.946: D/(4103): after: /storage/emulated/0/Android
                        /data/what.to.use.myapp/files/Lolpdf.pdf 14311309312  0
4

1 に答える 1

2

このInputStream.available()メソッドは、ダウンロード中のファイルのサイズを必ずしも返すとは限りません。ネットワーク呼び出しを行わずに利用可能なサイズを返すため、0 を返す可能性があります。最後に到達する:

byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
    os.write(buffer, 0, len);
}

available()これにより、ダウンロードするドキュメント全体を保持するのに十分なメモリを割り当てる必要がなく、期待どおりに返されないメソッドが回避されるため、メモリ効率が大幅に向上します。

于 2013-04-25T08:07:53.657 に答える