Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从InputStream保存PDF_Android - Fatal编程技术网

Android 从InputStream保存PDF

Android 从InputStream保存PDF,android,Android,我的代码有问题。我正在尝试从url保存PDF。PDF存在,但其长度为零。不过,inputstream的长度是正确的。为什么PDF不能正确保存 这是从流中保存PDF的实际代码: public void createExternalStoragePrivateFile (String name, String extension, InputStream is) { // Create a path where we will

我的代码有问题。我正在尝试从url保存PDF。PDF存在,但其长度为零。不过,inputstream的长度是正确的。为什么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

InputStream.available()
方法不一定返回正在下载的文件的大小,它将返回可用的文件,而无需进行任何网络调用,因此很可能返回0。更好的方法是分配一个小缓冲区,并一直读取,直到结束:

byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
    os.write(buffer, 0, len);
}
这将大大提高内存效率,因为它不需要您分配足够的内存来保存您正在下载的整个文档,并且它避免了
available()
方法无法返回您期望的内容。

+1 available()不应用于确定文件长度