Java – how do I retrieve the size of a file from a URL download (using an HTTP connection)?

I am using a project to download files using an HTTP connection I display a horizontal progress bar with progress bar status during download

.......
try {           
        InputStream myInput = urlconnect.getInputStream();
        BufferedInputStream buffinput = new BufferedInputStream(myInput);

        ByteArrayBuffer baf = new ByteArrayBuffer(capacity);
        int current = 0;
        while((current = buffinput.read()) != -1) {
            baf.append((byte) current);
        }
File outputfile = new File(createRepertory(app,0),Filename);
        FileOutputStream myOutPut = new FileOutputStream(outputfile);
        myOutPut.write(baf.toByteArray());
...
}

I know the size of my file in advance, so I need to retrieve the size in the download (in my while block) Therefore, I can determine the status of the progress bar

progressBarStatus = ((int) downloadFileHttp(url,app) * 100)/sizefile;

Long downloadfilehttp (..,..) Is the name of my function

I've tried by using outputFile Length to retrieve it, but its value is "1". Maybe this is the number of files I want to download

Update 1

Solution

Asynctask may be your perfect solution:

private class DownloadFileTask extends AsyncTask<URL,Integer,Long> {
 protected Long doInBackground(URL... urls) {
    Url url = urls[0];
    //connect to url here
    .......
    try {           
        InputStream myInput = urlconnect.getInputStream();
        BufferedInputStream buffinput = new BufferedInputStream(myInput);

        ByteArrayBuffer baf = new ByteArrayBuffer(capacity);
        int current = 0;
        while((current = buffinput.read()) != -1) {
            baf.append((byte) current);
            //here you can send data to onProgressUpdate
            publishProgress((int) (((float)baf.length()/ (float)sizefile) * 100));
        }
    File outputfile = new File(createRepertory(app,Filename);
    FileOutputStream myOutPut = new FileOutputStream(outputfile);
    myOutPut.write(baf.toByteArray());
    ...
 }

 protected void onProgressUpdate(Integer... progress) {
     //here you can set progress bar in UI thread
     progressBarStatus = progress;
 }

}

Start the asynctask call in your method

new DownloadFileTask().execute(url);
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>