我的代码有问题。我正在尝试从网址中保存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
答案 0 :(得分:2)
InputStream.available()
方法不一定会返回正在下载的文件的大小,它会在不进行任何网络调用的情况下返回可用的内容,因此可能会返回0.更好的方法是分配一个小缓冲区,并继续阅读,直到你到达终点:
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
这将节省更多内存,因为它不需要您分配足够的内存来保存您正在下载的整个文档,并且它避免了available()
方法没有返回您期望的内容它来。