java - 下载 SD 卡中的文件显示大小为 0

标签 java android

我有以下代码用于从 url 下载文件到 sdcard 。这段代码对于小文件工作正常,但是当文件大小很大时,我得到的下载文件大小为 0。 任何帮助将不胜感激。

Java 代码

setContentView(R.layout.activity_download_file);
        String exStorageDirectory = Environment.getExternalStorageDirectory()
                .toString();
        File folder = new File(exStorageDirectory, "Folder");
        folder.mkdir();
        File file = new File(folder, "scjp.pdf");
        try {
            if (!file.exists()) {
                file.createNewFile();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        downloadFile(
                "http://java.net/downloads/jfjug/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206-0071591060.pdf",
                file);

    }

    private void downloadFile(String fileUrl, File directory) {
        try {
            FileOutputStream fileOutput = new FileOutputStream(directory);
            URL url = new URL(fileUrl);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setRequestMethod("GET");
            connection.setDoOutput(true);
            connection.connect();
            InputStream inputStream = connection.getInputStream();
            byte buffer[] = new byte[1024];
            int len = 0;
            while ((len = inputStream.read(buffer)) > 0) {

                fileOutput.write(buffer, 0, len);

            }

            fileOutput.close();
            Thread.sleep(10000);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

最佳答案

尝试使用此代码。

package com.example.stack;


import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {



    ProgressDialog mProgressDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         overridePendingTransition(R.anim.enter, R.anim.enter);
        setContentView(R.layout.activity_main);

        // declare the dialog as a member field of your activity


        // instantiate it within the onCreate method
        mProgressDialog = new ProgressDialog(MainActivity.this);
        mProgressDialog.setMessage("A message");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        // execute this when the downloader must be fired
        DownloadFile downloadFile = new DownloadFile();
        downloadFile.execute("http://java.net/downloads/jfjug/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206-0071591060.pdf");
    }



    //The AsyncTask will look like this:

    // usually, subclasses of AsyncTask are declared inside the activity class.
    // that way, you can easily modify the UI thread from here
    private class DownloadFile extends AsyncTask<String, Integer, String> {
        @Override
        protected String doInBackground(String... sUrl) {
            try {
                URL url = new URL(sUrl[0]);
                URLConnection connection = url.openConnection();
                connection.connect();
                // this will be useful so that you can show a typical 0-100% progress bar
                int fileLength = connection.getContentLength();

                // download the file
                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream("/sdcard/output.pdf");

                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....
                    publishProgress((int) (total * 100 / fileLength));
                    output.write(data, 0, count);
                }

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

    //The method above (doInBackground) runs always on a background thread. You shouldn't do any UI tasks there. On the other hand, the onProgressUpdate and onPreExecute run on the UI thread, so there you can change the progress bar:

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog.show();
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            super.onProgressUpdate(progress);
            mProgressDialog.setProgress(progress[0]);
        }
    }

}

在 list 文件中添加以下权限。

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

我也在移动设备上进行了测试。它起作用了。

关于java - 下载 SD 卡中的文件显示大小为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15219484/

相关文章:

android - 使用 Android 2.x 的实时音频流

android - 从具有共享首选项的列表中保存复选框状态

java - Android根据坐标高亮显示Imageview区域

javascript - 为什么在 Google Chrome Android 中解锁 GPS 访问权限后 getCurrentPosition() 失败

java - 如何在 Spring 启动时使用 @InitBinder validator 验证同一 Controller 中的两个请求?

java - Singleton 类中的邮件 session

java - javafx 中 TableColumn 的 setCellValueFactory 不会为一个值输入文本,但会添加空格

java - Jooq 不使用存储功能的默认值

java - Android Rest 客户端 - JSON 响应中的连字符名称

java - OPC UA 测试堆栈示例