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

问题描述:

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

我需要阅读的已知格式的文件转换成String[] —,其中每行是阵列—在一个项目,然后回到该文件。

阅读尤其必须尽可能快。

有没有更好的办法,然后只使用线BufferedReader和阅读行到一个数组?

+2

http://stackoverflow.com/questions/326390/how-to-create-a-java-string-from-the-contents-of-a-file – OscarRyz 2011-04-04 20:55:14

+2

读写行不是序列化。我会纠正标题。 – 2011-04-04 20:56:18

+0

@Tom,好主意,但我觉得我们不妨一路走来修复身体。 @丹,我们正在编辑,因为“序列化”在Java中具有特定的含义,与您使用它的方式不匹配。 – Pops 2011-04-04 21:00:04

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

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(); 

这从\n检查每个输入字节释放BufferedReader。虽然我不确定这会比readLine()更快。

考虑使用谷歌protobuf

+0

+1告诉我关于protobuf。看起来很整洁! – 2011-04-04 21:22:37

使用NIO和UTF-8编码器/内搭你的字符串统计的优势,并采取JIT optmizations的优势解码器。我相信阿尔托out/in正在这样做,我相信你可以找到其他人。

这里将是我的第一关,假设该内存是不是一个问题(公顷)。

  1. 获取文件大小,因为它坐落在磁盘上(File.length)。
  2. 分配该大小缓冲区。
  3. 加载整个事件(InputStream.read(byte []))。
  4. 将该字符串完全拆分为内存中的子字符串。
  5. 做的东西(TM)
  6. 反向上面进行保存。

请记住,Java在内部使用UCS-16存储字符数据,这意味着您的漂亮ASCII文件将在磁盘上占用x2大小来解释“扩展”。例如你有一个4,124字节的foo.txt文件将在内存中至少8,248字节。

其他的一切将是比较慢的,因为应用程序将被专门用来对付某种缓冲和包装的(特别是对付没有足够的内存来处理的文件大小)。

祝你好运!