一度に 1 行のテキストを読み取り、その行を文字列に個別に追加するのは、各行の抽出と非常に多くのメソッド呼び出しのオーバーヘッドの両方に時間がかかります。
適切なサイズのバイト配列を割り当ててストリーム データを保持し、必要に応じてより大きな配列に繰り返し置き換え、配列が保持できる限り多くを読み取ろうとすることで、パフォーマンスを向上させることができました。
なんらかの理由で、コードが HTTPUrlConnection によって返された InputStream を使用すると、Android はファイル全体のダウンロードに繰り返し失敗しました。そのため、ファイル全体を取得するかキャンセルするかを確実にするために、BufferedReader と手動のタイムアウト メカニズムの両方を使用する必要がありました。転送。
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();
}
}
編集:コンテンツを再エンコードする必要がない場合 (つまり、コンテンツをAS ISにしたい場合) は、 Reader サブクラスを使用しないでください。適切な Stream サブクラスを使用するだけです。
前のメソッドの先頭を次の対応する行に置き換えて、さらに 2 ~ 3 倍高速化します。
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];