使用Java从文件读取和写入字符串的绝对最快方法是什么?

时间:2011-04-04 20:45:21

标签: java file serialization

使用Java从文件读取和写入字符串的绝对最快方法是什么?

我需要将已知格式的文件读入String[] - 其中每行是数组中的一个项目 - 然后返回到文件。

特别是阅读必须尽可能快。

有没有更好的方法,只需使用BufferedReader并逐行读取数组?

4 个答案:

答案 0 :(得分:3)

考虑使用Google protobuf

答案 1 :(得分:1)

只是一个疯狂的想法:你可以写出文件中每个字符串的长度。类似的东西:

BufferedInputStream stream=new BufferedInputStream(new FileInputStream("file.bin"));
byte[] buff=new byte[256];
String[] result=new String[10];
for(int i=0;i<10;i++){
    int n=(reader.read()<<8)|reader.read();    // string length (assuming all strings are less than 64K)
    if(buff.length<n) buff=new byte[n];
    reader.read(buff,0,n);
    result[i]=new String(buff,0,n);
}
stream.close();

这将使BufferedReader免于检查\n的每个输入字节。虽然我不确定这会比readLine()更快。

答案 2 :(得分:0)

使用NIO和UTF-8编码器/解码器,它们利用您的字符串统计信息并利用JIT优化。我相信aalto out / in正在这样做,我相信你可以找到其他人。

答案 3 :(得分:0)

这是我的第一次传球,假设记忆不是问题(哈)。

  1. 获取文件大小,因为它位于磁盘上(File.length)。
  2. 分配该大小的缓冲区。
  3. 一次性加载整个内容(InputStream.read(byte []))。
  4. 将字符串完全分解为内存中的子字符串。
  5. Do Stuff(tm)
  6. 反向上方保存。
  7. 请记住,Java在内部使用UCS-16存储字符数据,这意味着您的优秀ASCII文件将在磁盘上采用x2大小来解释“扩展”。例如你有一个4,124字节的foo.txt文件,内存中至少有8,248字节。

    其他所有内容都会变慢,因为应用程序将被设计为处理某种缓冲和包装(特别是处理没有足够的内存来处理文件大小)。

    祝你好运!