Bir kerede bir metin satırı okumak ve adı geçen satırı bir dizeye ayrı ayrı eklemek, her satırı ayıklamak ve çok sayıda yöntem çağrısının ek yükü için zaman alıcıdır.
Akış verilerini tutmak için düzgün boyutlu bir bayt dizisi ayırarak ve gerektiğinde yinelemeli olarak daha büyük bir dizi ile değiştirilerek ve dizi tutabildiği kadar okumaya çalışarak daha iyi performans elde etmeyi başardım.
Bazı nedenlerden dolayı, kod HTTPUrlConnection tarafından döndürülen InputStream'i kullandığında Android tekrar tekrar tüm dosyayı indiremedi, bu yüzden tüm dosyayı alacağımı veya iptal edeceğimden emin olmak için hem BufferedReader hem de elle yuvarlanan bir zaman aşımı mekanizması kullanmak zorunda kaldım transfer.
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: İçeriğin yeniden kodlanması gerekmiyorsa (yani içeriği OLDUĞUNU istiyorsanız) Reader alt sınıflarından hiçbirini kullanmamanız gerektiği ortaya çıkıyor. Uygun Stream alt sınıfını kullanmanız yeterlidir.
2 ila 3 kat fazla hızlandırmak için önceki yöntemin başlangıcını aşağıdaki satırlarla değiştirin .
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];