用Java从文件中读取和写入字符串的绝对最快的方式是什么?
我需要读取一个已知格式的文件到String[]
—其中每行是数组—然后返回文件。
阅读尤其要尽可能快。
是否有更好的方法,然后只是使用BufferedReader
和逐行读取到数组?
考虑使用Google protobuf
这是一个疯狂的想法:您可以在文件中写入每个字符串的长度。比如:
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()
更快。
使用NIO和UTF-8编码器/解码器,它们可以利用字符串统计信息,也可以利用JIT优化。我相信很多人都在这样做,我相信你也能找到其他人。
这是我的第一次传递,假设内存不是问题(ha)。
- 获取文件在磁盘上的大小(file .length)。
- 一次加载整个内容(InputStream.read(byte[]))。 在内存中将该字符串完全分解为子字符串。
- Do Stuff (tm)
请记住,Java内部使用UCS-16存储字符数据,这意味着您的漂亮ASCII文件将占用磁盘大小的x2来考虑"扩展"。例如,您有一个4,124字节的foo.txt文件将至少占用8,248字节的内存。
其他一切都将变慢,因为应用程序将被设计为处理某种缓冲和包装(特别是,处理没有足够的内存来处理文件大小)。
祝你好运!