有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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文件

我知道整个想法似乎有点老套或怪异,但有没有更快的方法

干杯:)


共 (2) 个答案

  1. # 1 楼答案

    做某事最快的方法往往是完全不做

    为什么不修改解析代码,这样就不需要末尾的换行符呢?如果每次都要添加它,那么最好更改代码,使其表现得好像它在那里,而实际上它不在那里

    接下来,我会尽量避免逐字符创建一个巨大的字符串,因为这确实是相当昂贵的。您可以基于InputStream创建Scanner,这可能比将数据读入String并对其进行解析快得多。您可以重写FileInputStream以在文件末尾返回一个虚拟换行符,从而避免粘贴字符串的恢复

    如果您确实必须将数据读入缓冲区,那么使用流中基于数组的read()方法读入字节数组可能会更好——比逐字节读取快得多。由于可以提前知道文件的大小,因此可以为额外的行尾标记分配缓冲区空间,并将其插入数组中。与创建StringBuffer并从中生成String不同,这不需要缓冲区的完整副本

  2. # 2 楼答案

    如果您所做的只是将生成的文件传递给扫描仪,那么您应该为该文件创建一个可读文件,并将其发送给扫描仪

    下面是一个例子(未经测试):

    public class NLReader implements Readable {
    
        Reader r;
        boolean atEndOfReader = false;
        boolean atEnd = false;
    
        public NLReader(Reader r) {
            this.r = r;
        }
    
        public int read(CharBuffer cb) throws IOException {
            if (!atEndOfReader) {
                int result = r.read(cb);
                if (result == -1) {
                    atEndOfReader = true;
                } else {
                    return result;
                }
            }
            if (!atEnd) {
                String nl = System.getProperty("line.separator");
                cb.append(nl);
                atEnd = true;
                return nl.length();
            }
    
            return -1;
        }
    }
    

    这只会读取文件一次,而不会复制它(与StringBuffer不同,您应该使用StringBuilder,除非您确实需要同步StringBuffer)

    这也不会将实际文件加载到内存中,因此也可以节省内存压力