การอ่านข้อความทีละบรรทัดและการต่อท้ายบรรทัดที่กล่าวถึงสตริงนั้นเป็นการใช้เวลานานทั้งในการแยกแต่ละบรรทัดและโอเวอร์เฮดของการเรียกใช้เมธอดจำนวนมาก
ฉันสามารถรับประสิทธิภาพที่ดีขึ้นโดยการจัดสรรอาร์เรย์ขนาดที่เหมาะสมเพื่อเก็บข้อมูลสตรีมและแทนที่ด้วยอาร์เรย์ขนาดใหญ่กว่าเมื่อจำเป็นและพยายามอ่านให้มากที่สุดเท่าที่อาร์เรย์สามารถเก็บได้
ด้วยเหตุผลบางอย่าง Android ล้มเหลวในการดาวน์โหลดไฟล์ทั้งหมดซ้ำ ๆ เมื่อรหัสที่ใช้ InputStream ที่ส่งคืนโดย HTTPUrlConnection ดังนั้นฉันจึงต้องใช้ทั้ง 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();
}
}
แก้ไข:ปรากฎว่าถ้าคุณไม่จำเป็นต้องมีการเข้ารหัสเนื้อหาอีกครั้ง (เช่นคุณต้องการเนื้อหาตามที่เป็น ) คุณไม่ควรใช้คลาสย่อย 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];