java - Android AsyncTask 将文件下载为目录

标签 java android android-asynctask

我正在尝试下载一个文件,但它是作为目录下载的,我不确定是什么问题。 Im 使用 ive 的类在其他项目中使用没有问题。

outfile是输出目录的完整路径,/mnt/sdcard/file.ext

public class DownloadFile {
    String outfile;
    String zipfile;
    Context c;
    Notification notification;
    NotificationManager notificationManager;
    ProgressBar progressBar;
    private int progress = 10;
    public DownloadFile(String url, String out, String zip, Context ctx) {        
        c = ctx;
        zipfile = zip;
        outfile = out;

        notificationManager = (NotificationManager) c.getSystemService(
                c.NOTIFICATION_SERVICE);

        new Download().execute(url);
    }

    private class Download extends AsyncTask<String, Integer, String>{
        @Override
        protected String doInBackground(String... urls) {
            int count;
            try {
                URL url = new URL(urls[0]);
                URLConnection conexion = url.openConnection();
                conexion.connect();
                int lenghtOfFile = conexion.getContentLength();

                InputStream input = new BufferedInputStream(url.openStream());
                //LINE 55 is below
                OutputStream output = new FileOutputStream(outfile);

                byte data[] = new byte[1024];

                long total = 0;

                while ((count = input.read(data)) != -1) {
                    total += count;
                    publishProgress((int)(total*100/lenghtOfFile));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return zipfile;
        }

        protected void onPreExecute() {                     
            Intent intent = new Intent(c, DownloadFile.class);
            final PendingIntent pendingIntent = PendingIntent.getActivity(c, 0, intent, 0);

            notification = new Notification(R.drawable.ic_launcher, "simulating a download", System
                    .currentTimeMillis());
            notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
            notification.contentView = new RemoteViews(c.getPackageName(), R.layout.download_progress);
            notification.contentIntent = pendingIntent;
            notification.contentView.setImageViewResource(R.id.status_icon, R.drawable.ic_launcher);
            notification.contentView.setTextViewText(R.id.status_text, "simulation in progress");
            notification.contentView.setProgressBar(R.id.status_progress, 100, progress, false);

            notificationManager.notify(42, notification);
        }       

        protected void onProgressUpdate(Integer... args){
            notification.contentView.setProgressBar(R.id.status_progress, 100, args[0], false);         
        }

        protected void onPostExecute(String f) {
            Toast.makeText(c, "DONE WITH "+f, 9965454).show();
            notificationManager.cancel(42);
        }
    }
}

这是它抛出的错误。

W/System.err(15992): java.io.FileNotFoundException: /mnt/sdcard/t3hh4xx0r/romCrawler/imoseyon_leanKernel_v1.9.0gnexus.zip: open failed: EISDIR (Is a directory)
W/System.err(15992):    at libcore.io.IoBridge.open(IoBridge.java:406)
W/System.err(15992):    at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
W/System.err(15992):    at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
W/System.err(15992):    at java.io.FileOutputStream.<init>(FileOutputStream.java:117)
W/System.err(15992):    at com.t3hh4xx0r.romcrawler.DownloadFile$Download.doInBackground(DownloadFile.java:55)
W/System.err(15992):    at com.t3hh4xx0r.romcrawler.DownloadFile$Download.doInBackground(DownloadFile.java:1)
W/System.err(15992):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
W/System.err(15992):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
W/System.err(15992):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
W/System.err(15992):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
W/System.err(15992):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
W/System.err(15992):    at java.lang.Thread.run(Thread.java:856)
W/System.err(15992): Caused by: libcore.io.ErrnoException: open failed: EISDIR (Is a directory)
W/System.err(15992):    at libcore.io.Posix.open(Native Method)
W/System.err(15992):    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
W/System.err(15992):    at libcore.io.IoBridge.open(IoBridge.java:390)
W/System.err(15992):    ... 11 more

为什么要尝试将文件下载为目录?

编辑 有关该问题的更多信息,错误中列出的路径 /mnt/sdcard/t3hh4xx0r/romCrawler/imoseyon_leanKernel_v1.9.0gnexus.zip 是我尝试访问的文件的路径和文件名下载。不过,它没有下载,而是创建了一个具有该名称的文件夹。我的 SD 卡上有一个名为 imoseyon_leanKernel_v1.9.0gnexus.zip 的文件夹,位于 `/mnt/sdcard/t3hh4xx0r/romCrawler/

最佳答案

您必须确保没有同名的目录。我有一个类似的问题。在我的例子中,它是由 File.mkdirs() 创建的。

我会尝试在创建 FileOutputStream 之前删除目录:

new File(outfile).delete();

关于java - Android AsyncTask 将文件下载为目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10003665/

相关文章:

android - 在 AsyncTask 完成时完成调用 Activity

android - Android 登录 HttpPost 的异步任务

java - stringByEvaluatingJavascriptFromString(iOS 方法,Android 等效方法是什么?)

java - Android 版谷歌地图应用程序无法在市场上使用

java - Cordova Ionic Java 版本错误

javascript - Intel XDK 使用 cordova 插件检测来电

Java 递归 - 传递引用的替代方法 :

java - "Insert AssignmentOperator expression"JAVA错误

java - For Loop 延迟不工作 Android

android - 在单个服务中处理多个网络调用