2015-11-03 85 views
2

在我的Android應用程序中,我使用FileInputStream讀取一個文本文件,該文件的大小小於100 kb,並在應用程序中顯示其內容。主要問題是,雖然文件不是很大,但我的設備需要大約3-4秒才能打開文件。Android讀取文本文件太慢

考慮到我的設備有1GB內存和四核CPU,我想知道我讀取文本文件的方式有什麼問題,並且有沒有更好的方法使進程更快?

String aBuffer = ""; 
    try { 
     File myFile = new File(input); 
     FileInputStream fIn = new FileInputStream(myFile); 
     BufferedReader myReader = new BufferedReader(new InputStreamReader(
       fIn)); 
     String aDataRow = ""; 

     while ((aDataRow = myReader.readLine()) != null) { 
      aBuffer += aDataRow + "\n"; 
     } 
     // Toast.makeText(getBaseContext(), aBuffer, 
     // Toast.LENGTH_SHORT).show(); 
     myReader.close(); 
    } catch (Exception e) { 
     Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT) 
       .show(); 
    } 

    return aBuffer; 
+0

你應該改變你的策略。不要一次加載所有文本。逐步進行。最後,這是很多文字! –

+0

有什麼方法可以加載文本文件的一部分? – sun1987

+5

另外,不要使用字符串連接:http://www.yoda.arachsys.com/java/strings.html –

回答

4

你的String concat是一個非常慢的操作。您應該使用StringBuilder此任務:

String aDataRow = ""; 
StringBuilder buffer = new StringBuilder(); 

while ((aDataRow = myReader.readLine()) != null) { 
    buffer.append(aDataRow); 
    buffer.append("\n"); 
} 
aDataRow = buffer.toString(); 

,你甚至可以加快閱讀,如果你不按行讀取文件行(因爲這可能是一個非常小的緩衝區大小)。您可以設置自定義緩存大小是這樣的:

File myFile = new File(input); 
FileInputStream fIn = new FileInputStream(myFile); 
//needed to shrink the copied array in the last iteration of the length of the content 
int byteLength; 
//find a good buffer size here. 
byte[] buffer = new byte[1024 * 128]; 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
while((byteLength = fIn.read(buffer)) != -1){ 
    byte[] copy = Arrays.copyOf(buffer, byteLength); 
    out.write(copy, 0, copy.length); 
} 
String output = out.toString(); 
+0

感謝模擬器。它變得更好了。有沒有辦法讓它更快? – sun1987

+0

非常感謝。它變得更好。但還有一個問題。對於大多數大約100kb到150kb的文件,您提到的緩衝區的最佳大小是多少? – sun1987

+0

因爲你的文件非常小,你的緩衝區可能是你的文件的大小,即1024 * 150字節。對於「完美」尺寸,您必須在您正在使用的設備上測試一些不同的值並記錄所需的時間。 – Simulant

2
  • 找出文件大小。
  • 分配一個這樣大小的緩衝區。
  • 閱讀整個文件一旦進入緩衝區(即不通過線,這將是緩慢的讀取線吧)
0

您應該使用線程文件讀取和因爲它減緩寫操作下降主線程,這會減慢你的閱讀速度以及性能。