2012-06-06 9 views
5

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

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); 

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

ответ

6

использовать 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); 
+4

Также длина содержимого может быть -1, если сервер не поддерживает это или по какой-либо причине размер файла неизвестен. –

+0

ВНИМАНИЕ: 'url.openConnection(). GetContentLength()' будет делать 'GET', а не' HEAD'. См. Ответ от Santosh ниже для лучшего метода (т. Е. Do 'connection.setRequestMethod (" HEAD ")' перед вызовом 'getContentLength()'). –

2

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

3

попробовать это с помощью 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); 
1

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

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

3

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

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; 
     } 
    } 
} 

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

+0

Документация метода 'URLConnection.getContentLength()' (как предложено другими респондентами) гласит: «Возвращает длину содержимого в байтах, заданных полем заголовка ответа' content-length' или -1, если это поле не задано «. Поэтому кажется, что этот метод на самом деле также не загружает содержимое. Поправьте меня, если я ошибаюсь. –

+1

Adil, Да, это так. Он получает только заголовки без запуска загрузки файла. – Santosh

+0

Нет, 'url.openConnection(). GetContentLength()' будет делать 'GET' (по крайней мере, в Java 7). Настройте серверную часть и проверьте запросы, отправленные Java-клиентом. –

Смежные вопросы