2011-11-03 90 views
0

从内部手机存储中读取一个小文件(138 kb)非常缓慢。大约需要490毫秒。写入相同的文件仅在70 ms中完成。 (在仿真器中测得)缓慢读取文件

有没有加速的建议?

谢谢,亚历山大Miehlke,柏林

private String readFromInternal(String filename) { 
    try { 
     FileInputStream fileInputStream = openFileInput(filename); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); 
     StringBuilder stringBuilder = new StringBuilder(); 
     String line; 
     while ((line = bufferedReader.readLine()) != null) 
      stringBuilder.append(line); 
     return stringBuilder.toString(); 
    } catch (Exception e) { 
     return null; 
    } 
} 

private boolean writeToInternal(String filename, String text) { 
    try { 
     FileOutputStream fileOutputStream = openFileOutput(filename, Context.MODE_PRIVATE); 
     fileOutputStream.write(text.getBytes()); 
     fileOutputStream.close(); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 

回答

-1

你的问题是,你正在阅读逐行,但一气呵成写。尝试将文件一次读入缓冲区而不是while循环。

+2

令人怀疑。他正在使用BufferedReader。如果缓冲区足够大,那应该没什么区别。 –

0

我不会在模拟器上对任何东西进行基准测试。你可以可能通过确保你的BufferedReader有一个相对较大的缓冲区来加快速度。说4k-ish。多年前我为了获得最佳缓冲区大小而进行了一般性Java测试,并且在1-2k以上,似乎没有多大帮助。

试试手机上。

为什么阅读速度比写作速度慢不止我,但同样,模拟器并不是您想要进行基准测试的地方。

可能尝试颠倒缓冲区位置。把缓冲流周围,而不是读者:

新的BufferedReader(新的InputStreamReader(新的BufferedInputStream(的FileInputStream,2048)))

我假设你使用一个BufferedReader能够通过在线阅读。创建2个bufferes可能不是很好,所以如果你有一种方法来读取不需要BufferedReader的行,你可能会更好。

+0

我已经在我的智能手机上试过了,但它很相似。读取同一个文件需要700ms。写作也很慢(1469毫秒)。增加缓冲区没有效果。 – almisoft

+0

虽然这些数字很大,但电话号码对我来说更有意义(写入时间长于读取时间)。如前所述,我会在InputStreamReader之前放置BufferedInputStream,并至少使用2K缓冲区。如果它仍然不好,我会做一些原始的阅读测试。制作一个大的字节数组,并一次读取整个文件。逐行忘记。删除尽可能多的变量。在循环中多次运行读取的文件(由于操作系统缓存可能需要不同的文件)。 –

+0

我尝试了各种方法,并进行了大量测试,但速度很慢。现在我将数据(不是这些大文件)保存在数据库中,这只需要几毫秒。 – almisoft