android使用InputStream FileOutputStream下载多个文件

时间:2015-12-12 17:34:19

标签: java android intentservice

所以我有一个应用程序可以下载某些文件,专用于我的客户,他在远程位置托管他的文件,我使用下面的代码这样做:

public class DownloadService extends IntentService {

    private int result = Activity.RESULT_CANCELED;
    public DownloadService() {
        super("DownloadService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        String urlPath = intent.getStringExtra(URL);
        String fileName = intent.getStringExtra(FILENAME);
        File output = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
                fileName);
        if (output.exists()) {
            output.delete();
        }

        URLConnection streamConnection = null;
        InputStream stream = null;
        FileOutputStream fos = null;
        try {

            URL url = new URL(urlPath);
            streamConnection = url.openConnection();
            stream = streamConnection.getInputStream();
            streamConnection.connect();
            long lengthofFile = streamConnection.getContentLength();
            InputStream reader = stream;
            bis = new BufferedInputStream(reader);
            fos = new FileOutputStream(output.getPath());
            int next = -1;
            int progress = 0;
            int bytesRead = 0;
            byte buffer[] = new byte[1024];
            while ((bytesRead = bis.read(buffer)) > 0) {
                fos.write(buffer, 0, bytesRead);
                progress += bytesRead;
                int progressUpdate = (int)((progress * 100) / lengthofFile);
                Intent testIntent = new Intent(".MESSAGE_INTENT");
                testIntent.putExtra(PERCENTAGE, progressUpdate);
                sendBroadcast(testIntent);
            }
            result = Activity.RESULT_OK;
            fos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        publishResults(output.getAbsolutePath(), result);
    }

    private void publishResults(String outputPath, int result) {
        Intent intent = new Intent(".MESSAGE_INTENT");
        intent.putExtra(FILEPATH, outputPath);
        intent.putExtra(RESULT, result);
        sendBroadcast(intent);
    }

}

并调用此服务我将使用:

Intent intent = new Intent(MainActivity.getAppContext(), DownloadService.class);
intent.putExtra(DownloadService.FILENAME, downloadFileName[item]);
intent.putExtra(DownloadService.URL, urlDownload[item]);
MainActivity.getAppContext().startService(intent);

现在这允许用户一次下载一个文件,但是如果用户下载另一个文件,则第二个文件必须等到第一个文件完成下载。 现在我的情况是: 1-首先下载FILE_1正在下载,状态为FILE_1。 2-用户单击新文件下载,状态将第一个文件名更改为第二个文件名,并等待FILE_1完成下载以使用FILE_2开始,但是活动下载从FILE_1更改为FILE_2。

问题: 有没有办法多次调用DownloadService多个文件? 是否有可能解决我所面临的问题?将下载意图服务视为两种不同的意图?

更新 我设法通过为每个文件分配一个唯一的Int ID来解决这个问题,每个ID将指向listview中的一个位置,该位置显示正在下载或排队的文件,然后我使用它上面的每个文件。

1 个答案:

答案 0 :(得分:0)

以下代码使用commons-io-2.4.jar库通过处理低级数据移动使您的工作变得轻松,因为您将专注于手头的方法

URL someUrl = new URL("your url String"); //
File someFile = new File("your file, where you want to save the data");
FileUtils.copyURLToFile(someUrl, someFile );

如果你想调用这个语句很少一段时间从服务器下载不同的文件代码可能会让你知道你可能想做什么,但是你必须编写它的等效代码才能在你想要的android中运行可能是AsyncTask

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.commons.io.FileUtils;

public class DownloadTest {

    public static void main(String[] args) {

        Thread thread = new Thread(){
            @Override
            public void run() {
                // TODO Auto-generated method stub
                super.run();
                try {
                    dowanloadFile(new URL("some url"), new File("some file"));
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        thread.start();


    }

    private static void dowanloadFile(URL url, File file){
        try {
            FileUtils.copyURLToFile(url, file );
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}