La lecture d'une ligne de texte à la fois et l'ajout de ladite ligne à une chaîne individuellement prend du temps à la fois pour l'extraction de chaque ligne et la surcharge de tant d'appels de méthode.
J'ai pu obtenir de meilleures performances en allouant un tableau d'octets de taille décente pour contenir les données de flux, et qui est remplacé de manière itérative par un tableau plus grand si nécessaire, et en essayant de lire autant que le tableau peut contenir.
Pour une raison quelconque, Android n'a pas réussi à télécharger le fichier entier à plusieurs reprises lorsque le code utilisait le InputStream retourné par HTTPUrlConnection, j'ai donc dû recourir à la fois à un BufferedReader et à un mécanisme de délai d'expiration manuel pour m'assurer que j'obtiendrais le fichier entier ou annulerais le transfert.
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();
}
}
EDIT: Il s'avère que si vous n'avez pas besoin de ré-encoder le contenu (c'est-à-dire que vous voulez le contenu TEL QUEL ), vous ne devez utiliser aucune des sous-classes de Reader. Utilisez simplement la sous-classe Stream appropriée.
Remplacez le début de la méthode précédente par les lignes correspondantes de la suivante pour l'accélérer de 2 à 3 fois supplémentaires .
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];