¿Los objetos InputStream tiene un límite de almacenamiento?

DaN
12 de Enero del 2006
Intento recoger un archivo (supongamos un TXT) desde una dirección web (URL) por ejemplo:

http://host:port/path/file.txt

Lo hago mediante el siguiente método:

public byte[] getBytesFromUrl(String direccion) throws Exception{

String dir = "http://EX-C0091/RecuperaPDF/email_es_all_01.txt";

URL url = new URL(dir);

HttpURLConnection con = (HttpURLConnection)url.openConnection();

con.connect();

DataInputStream dis = new
InputStream s = con.getInputStream();

byte[] data = new byte[con.getContentLength()];

int read_bytes = dis.read(data);

s.close();

return data;
}

Pues bien... muchos me diréis que la mejor forma de calcular el tamaño del array de bytes (byte[] data) sería más correcta de esta forma:

byte[] data = new byte[s.available()];

pero desgraciadamente, este método -s.available()- sólo devuelve una cantidad de bytes disponibles no superior a 16KB en cualquier caso, sea cual sea el tamaño real en bytes del fichero que quiero recoger. Por ello he decido establecer el tamaño utilizando el getContentLength() del objeto HttpUrlConnection, que si determina correctamente el tamaño exacto del archivo que voy a leer en el array estableciendo su tamaño de forma correcta.

Mi poblema es que aunque el array de bytes "data" tenga un tamaño considerable, en ningún caso llega a leer más de 30KB.

En cambio, si hago alguna burrada como esta:

byte[] data = byte[con.getContentLength * 10];

al hacer el típico read y recoger el valor que devuelve, el número de bytes leido asciende a 70KB aprox. :

int read_bytes = s.read(data);

Más o menos he podido he llegado a la conclusión de que el error debe estar en esta línea:

InputStream s = con.getInputStream();

ya que ese Stream no se debe estar cogiendo toda la información completa, sino con una parte del fichero (nunca superior a 16.132 bytes segun el método -s.available- que es la cantidad que devuelve.

¿Alguien sabe que estoy haciendo mal? ¿Alguien tiene alguna idea de lo que está pasando?...

¿alguien... ?

Gracias

DaN
12 de Enero del 2006
[*] Hay un error en el código anterior:

- Donde puse:
DataInputStream dis = new
InputStream s = con.getInputStream();

- Iría:
InputStream s = con.getInputStream();