Leer una línea de texto a la vez y agregar dicha línea a una cadena individualmente lleva mucho tiempo, tanto en la extracción de cada línea como en la sobrecarga de tantas invocaciones de métodos.
Pude obtener un mejor rendimiento al asignar una matriz de bytes de tamaño decente para contener los datos de la secuencia, y que se reemplaza iterativamente por una matriz más grande cuando es necesario, y al tratar de leer tanto como la matriz podría contener.
Por alguna razón, Android repetidamente no pudo descargar el archivo completo cuando el código usó el InputStream devuelto por HTTPUrlConnection, por lo que tuve que recurrir al uso de un BufferedReader y un mecanismo de tiempo de espera manual para asegurarme de obtener el archivo completo o cancelar la transferencia.
private static final int kBufferExpansionSize = 32 * 1024;
private static final int kBufferInitialSize = kBufferExpansionSize;
private static final int kMillisecondsFactor = 1000;
private static final int kNetworkActionPeriod = 12 * kMillisecondsFactor;
private String loadContentsOfReader(Reader aReader)
{
BufferedReader br = null;
char[] array = new char[kBufferInitialSize];
int bytesRead;
int totalLength = 0;
String resourceContent = "";
long stopTime;
long nowTime;
try
{
br = new BufferedReader(aReader);
nowTime = System.nanoTime();
stopTime = nowTime + ((long)kNetworkActionPeriod * kMillisecondsFactor * kMillisecondsFactor);
while(((bytesRead = br.read(array, totalLength, array.length - totalLength)) != -1)
&& (nowTime < stopTime))
{
totalLength += bytesRead;
if(totalLength == array.length)
array = Arrays.copyOf(array, array.length + kBufferExpansionSize);
nowTime = System.nanoTime();
}
if(bytesRead == -1)
resourceContent = new String(array, 0, totalLength);
}
catch(Exception e)
{
e.printStackTrace();
}
try
{
if(br != null)
br.close();
}
catch(IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
EDITAR: Resulta que si no necesita tener el contenido codificado de nuevo (es decir, si desea el contenido TAL CUAL ), no debe usar ninguna de las subclases de Reader. Simplemente use la subclase Stream adecuada.
Reemplace el comienzo del método anterior con las líneas correspondientes de lo siguiente para acelerarlo de 2 a 3 veces más .
String loadContentsFromStream(Stream aStream)
{
BufferedInputStream br = null;
byte[] array;
int bytesRead;
int totalLength = 0;
String resourceContent;
long stopTime;
long nowTime;
resourceContent = "";
try
{
br = new BufferedInputStream(aStream);
array = new byte[kBufferInitialSize];