한 번에 한 줄의 텍스트를 읽고 해당 줄을 개별적으로 문자열에 추가하면 각 줄을 추출하고 너무 많은 메소드 호출의 오버 헤드가 발생합니다.
스트림 데이터를 보유하기 위해 적절한 크기의 바이트 배열을 할당하고 필요할 때 더 큰 배열로 반복적으로 대체하고 배열이 보유 할 수있는 한 많이 읽으려고 노력함으로써 더 나은 성능을 얻을 수있었습니다.
어떤 이유로 든 코드에서 HTTPUrlConnection에 의해 반환 된 InputStream을 사용할 때 전체 파일을 반복적으로 다운로드하지 못했기 때문에 전체 파일을 가져 오거나 취소 할 수 있도록 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];