我已经把头发拉了一段时间了。以下方法应该下载文件,并将其保存到硬盘驱动器上指定的位置。
private static void saveImage(Context context, boolean backgroundUpdate, URL url, File file) {
if (!Tools.checkNetworkState(context, backgroundUpdate))
return;
// Get the image
try {
// Make the file
file.getParentFile().mkdirs();
// Set up the connection
URLConnection uCon = url.openConnection();
InputStream is = uCon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
// Download the data
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
// Write the bits to the file
OutputStream os = new FileOutputStream(file);
os.write(baf.toByteArray());
os.close();
} catch (Exception e) {
// Any exception is probably a newtork faiilure, bail
return;
}
}
此外,如果文件不存在,则应该为该文件创建目录。 (如果该位置已经存在另一个文件,则应该不执行任何操作)。但是,由于某种原因,mkdirs()方法永远不会创建目录。我已经尝试了从显式括号到显式创建父文件类的所有内容,似乎没有任何工作。我相当肯定驱动器是可写的,因为它只在已经确定之后调用,在调试时运行它也是如此。因此该方法失败,因为没有创建父目录。任何人都可以告诉我,我的方式是否有任何问题?
此外,如果它有帮助,这里是我正在调用它的文件的来源:
谢谢
答案 0 :(得分:30)
如果您要将内容写入SD卡,则希望您在清单中添加了android.permission.WRITE_EXTERNAL_STORAGE
权限
答案 1 :(得分:13)
请检查一下,它可以帮助你..
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在清单文件中输入tis权限。
答案 2 :(得分:5)
除Kevin Day的回复外,之前的帖子没有提及另一种失败方式。即使您的清单中有android.permission.WRITE_EXTERNAL_STORAGE
,如果您尝试写入外部作为USB小工具安装的/mnt/sdcard
等媒体(即您将设备作为外部磁盘连接到当您尝试写入时,您的PC使用USB电缆),然后您无法写入/ mnt / sdcard文件系统。在这种情况下,FILE.mkdir
将返回false。显然,如果您没有检查返回代码,那么在您尝试在您认为自己创建的目录中创建文件之前,如果获得IOException
,则不会看到此问题。如果你不在这个不存在的目录中创建一个文件,那么应用程序将默默地失败。
我在调试Android应用程序时经常犯这个错误 - 忘记我不能同时在外部安装sdcard,同时让我的应用程序写入它。
答案 3 :(得分:3)
你确定mkdirs失败了吗?为什么不检查mkdirs调用的返回值并在返回false时记录错误消息?
if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()){
log("Unable to create " + file.getParentFile());
}
我怀疑你可能会对文件的内容感到惊讶......
PS - 请使用该错误处理程序执行某些操作 - 至少记录错误。捕捉异常并做出无声的回归是一种可怕的做法。