Đọc một dòng văn bản tại một thời điểm và nối thêm dòng đã nói vào một chuỗi riêng lẻ tốn thời gian cả trong việc trích xuất từng dòng và chi phí của rất nhiều cách gọi phương thức.
Tôi đã có thể có được hiệu suất tốt hơn bằng cách phân bổ một mảng byte có kích thước phù hợp để giữ dữ liệu luồng và được thay thế bằng một mảng lớn hơn khi cần và cố gắng đọc càng nhiều mảng càng tốt.
Vì một số lý do, Android liên tục không tải xuống được toàn bộ tệp khi mã được sử dụng InputStream được trả về bởi HTTPUrlConnection, vì vậy tôi đã phải sử dụng cả BufferedReader và cơ chế hết thời gian cuộn bằng tay để đảm bảo tôi sẽ lấy toàn bộ tệp hoặc hủy việc chuyển nhượng.
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: Hóa ra nếu bạn không cần phải mã hóa lại nội dung (nghĩa là bạn muốn nội dung NHƯ VẬY ) thì bạn không nên sử dụng bất kỳ lớp con Reader nào. Chỉ cần sử dụng lớp con Stream thích hợp.
Thay thế bắt đầu của phương pháp trước bằng các dòng tương ứng sau để tăng tốc thêm 2 đến 3 lần .
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];