¿Es posible determinar el tamaño del archivo que se va a descargar?

Tengo actualmente el código siguiente que lee un archivo situado en la tela y lo escribe a un archivo en el teléfono:

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

¿Alguien sabe si es posible (usando la configuración anterior o de otro modo) determinar el número total de bytes que se deben leer antes de comenzar con la descarga (para publicar el porcentaje de progreso al usuario a medida que se realiza la descarga)?

Utilice el método URLConnection de 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); 

Prueba esto usando 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); 

Para determinar el número total de bytes que se deben leer antes de comenzar con la descarga, una forma es obtener sólo los encabezados de respuesta enviando una solicitud HTTP HEAD de la siguiente manera:

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

Esto imprimirá el tamaño del contenido que se descargará sin descargar realmente el contenido.

Puede enviar una solicitud al servidor para devolver el tamaño de archivo. Utilice ese tamaño de archivo en su barra de progreso e inicie la descarga. Entonces, estas son dos solicitudes independientes, pero puede agruparlas en la misma tarea de asyc. Así que primero obtiene el archivo fielszie, haga una llamada a progressUpdate donde se establecen los valores para la barra de progreso y luego continúe con la descarga con llamadas periódicas a progressUpdate() para cambiar el estado de la barra de progreso.

El método getContentLength de URLConnection debería darle el tamaño del archivo que se descargará. De esto puedes dibujar tu ProgressBar como quieras, actualizándolo (en onProgressUpdate, asumiendo que lo estás haciendo dentro de un AsyncTask.), Siempre que nuevos datos sean procesados ​​por tu fileOutputStream.

Si el servidor no le da un valor en getContentLength (-1 en la mayoría de los casos, pero al menos compruebe si es menor o igual a cero), haga que ProgressBar sea indeterminado.

  • Obtener acceso a los recursos de un ArrayAdapter en Android
  • Ejecución de pruebas de instrumentación desde un paquete específico mediante un complemento de cuchara-gradle
  • Crear PDU para Android que funciona con SmsMessage.createFromPdu () (GSM 3gpp)
  • CameraManager en dispositivos que funcionan con menos de Lollipop
  • ¿Hay alguna manera de ejecutar Runnable ejecutar () lanzar una excepción?
  • ViewPagerIndicator - Establece TabPageIndicator en el centro
  • No se pueden serializar las fechas con ksoap2
  • La aplicación de Android se bloquea después de la versión de actualización de las herramientas de SDK (NoClassDefFound, versión de la herramienta 22)
  • Creación de un número aleatorio de 4 dígitos y almacenamiento de una cadena
  • Ubicación de Android getBearing () devuelve siempre 0
  • Android Studio No se puede resolver el símbolo 'Before' en import org.junit.Before
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.