Можно определить размер загружаемого файла?

В настоящее время у меня есть следующий код, который читает файл, расположенный в Интернете, и записывает его в файл на телефоне:

InputStream inputStream = new URL(sourceFileWebAddress).openStream(); BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); FileOutputStream fileOutputStream = new FileOutputStream(targetFile); int count; byte buffer[] = new byte[1024]; while ((count = bufferedInputStream.read(buffer, 0, buffer.length)) != -1) fileOutputStream.write(buffer, 0, count); 

Кто-нибудь знает, возможно ли это (используя настройку выше или иначе), чтобы определить общее количество байтов, которые должны быть прочитаны, прежде чем начать с загрузки (чтобы опубликовать процентный прогресс для пользователя при продолжении загрузки)?

Используйте метод getContentLength для URLConnection

 URL url = new URL(sourceFileWebAddress); URLConnection connection = url.openConnection(); connection.connect(); int fileLenth = connection.getContentLength(); InputStream inputStream = url.openStream(); BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); 

Попробуйте это, используя URLConnnection

 URLConnection connection = new URL(sourceFileWebAddress).openStream(); InputStream stream = connection.getInputStream(); System.out.println("total size: "+connection.getContentLength();//size BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); FileOutputStream fileOutputStream = new FileOutputStream(targetFile); int count; byte buffer[] = new byte[1024]; while ((count = bufferedInputStream.read(buffer, 0, buffer.length)) != -1) fileOutputStream.write(buffer, 0, count); 

Чтобы определить общее количество байтов, которые должны быть прочитаны до начала загрузки, одним из способов является получение заголовков ответов , отправляя запрос HTTP HEAD следующим образом:

 import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; public class SimpleHTTPRequest { public static void main(String[] args) { HttpURLConnection connection = null; URL serverAddress = null; try { String sourceFileWebAddress = "http://localhost:8080/mycontents"; serverAddress = new URL(sourceFileWebAddress); //set up out communications stuff connection = null; //Set up the initial connection connection = (HttpURLConnection)serverAddress.openConnection(); //HEAD request will make sure that the contents are not downloaded. connection.setRequestMethod("HEAD"); connection.connect(); System.out.println("========"+connection.getContentLength()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //close the connection, set all objects to null connection.disconnect(); connection = null; } } } 

Это будет печатать размер загружаемого контента без фактической загрузки содержимого.

Вы можете отправить запрос на сервер, чтобы вернуть размер файла. Используйте этот файл в вашем рабочем баре и инициируйте загрузку. Так что это два отдельных запроса, но вы можете связать их в одной и той же задаче asyc. Таким образом, вы сначала получаете fielszie, делаете вызов progressUpdate где вы устанавливаете значения для progressbar, а затем продолжаете загрузку с периодическими вызовами progressUpdate() чтобы изменить статус progressbar.

Метод getContentLength URLConnection должен предоставить вам размер загружаемого файла. Из этого вы можете нарисовать свой ProgressBar по своему усмотрению, обновив его (в onProgressUpdate, предполагая, что вы делаете это внутри AsyncTask. Вы правы?) Всякий раз, когда новые данные обрабатываются вашим файловым потоком.

Если сервер не дает вам значение в getContentLength (-1 в большинстве случаев, но, по крайней мере, проверяет, меньше или равно нулю), просто сделайте свой ProgressBar неопределенным.