java向加载到内存中的文件追加字符的最快/最有效的方法是什么?
read_data = new BufferedReader( new FileReader(args[0]) );
data_buffer = new StringBuffer();
int i;
while(read_data.ready())
{
while((i = read_data.read()) != -1)
{
data_buffer.append((char)i);
}
}
data_buffer.append(System.getProperty("line.separator"));
我想做的是,读一整本书。将txt文件转换为字符串,并在字符串中添加换行符。然后通过传递数据缓冲区创建一个新的扫描器来处理这个字符串。toString()。显然,对于非常大的文件,这个过程会占用很多时间,我只想在。我已经读入内存的txt文件
我知道整个想法似乎有点老套或怪异,但有没有更快的方法
干杯:)
# 1 楼答案
做某事最快的方法往往是完全不做
为什么不修改解析代码,这样就不需要末尾的换行符呢?如果每次都要添加它,那么最好更改代码,使其表现得好像它在那里,而实际上它不在那里
接下来,我会尽量避免逐字符创建一个巨大的字符串,因为这确实是相当昂贵的。您可以基于
InputStream
创建Scanner
,这可能比将数据读入String
并对其进行解析快得多。您可以重写FileInputStream
以在文件末尾返回一个虚拟换行符,从而避免粘贴字符串的恢复如果您确实必须将数据读入缓冲区,那么使用流中基于数组的
read()
方法读入字节数组可能会更好——比逐字节读取快得多。由于可以提前知道文件的大小,因此可以为额外的行尾标记分配缓冲区空间,并将其插入数组中。与创建StringBuffer
并从中生成String
不同,这不需要缓冲区的完整副本# 2 楼答案
如果您所做的只是将生成的文件传递给扫描仪,那么您应该为该文件创建一个可读文件,并将其发送给扫描仪
下面是一个例子(未经测试):
这只会读取文件一次,而不会复制它(与StringBuffer不同,您应该使用StringBuilder,除非您确实需要同步StringBuffer)
这也不会将实际文件加载到内存中,因此也可以节省内存压力