java - 将文本文件读取为字符串而不消耗大量内存

标签 java file-io memory-leaks nio

我尝试过使用 NIO(读取单个文件最慢)、BufferedInputStream 并逐行读取文件(平均每次传递 600 毫秒)来测量将文件读入字符串的几种方法的性能,然后使用 Filereader 和固定大小的数组作为缓冲区(最快)来读取该流(最快)

文件为 Windows .txt 文件格式的 95 MB 纯文本。将字符转换为字符串确实是瓶颈,但我注意到这种方法的内存消耗巨大。对于 95 MB 的 lorem ipsum,这会消耗最多 1 GB 的 RAM。我还没找到原因。

我尝试过但没有效果:

通过调用 System.gc() 发出垃圾收集器 在方法结束之前将所有指针变量设置为 null(但无论如何都应该如此,它们仅在方法内定义)。

private void testCharStream() {
            File f = f = new File("c:/Downloads/test.txt");
    long oldTime = System.currentTimeMillis();
    char[] cbuf = new char[8192];
    StringBuilder builder = new StringBuilder();
    try {

        FileReader reader = new FileReader(f);

        while (reader.read(cbuf) != -1) {
            builder.append(cbuf);
        }

        reader.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    long currentTime = System.currentTimeMillis();

    System.out.println(currentTime - oldTime);
}

最佳答案

尝试 Apache Commons IO:http://commons.apache.org/proper/commons-io/ 我没有对其进行基准测试,但我认为代码已经过优化。

关于java - 将文本文件读取为字符串而不消耗大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18428657/

相关文章:

java - 如何使用 Jersey 客户端对启用 JAAS 的 Web 服务器进行身份验证?

java - 在java中将数据从标准输出写入文本文件不起作用

c - 调试内存损坏

c++ - 获取堆上可用内存的大小

java - 那里有哪些 Java 外部包/库?

java - ReplyingKafkaTemplate 是否阻塞?

Linux 读取操作请求重复字节?

haskell - 什么是空间泄漏?

java - 检测ajax请求调用

c++ - 如何读取 infile 中的指令,然后使用 infile 中的参数将函数形状写入 outfile