java - 缩放文本文件 IO 应用程序

标签 java

我正在编写一个 Java 应用程序,它读取逗号分隔的文本文件,对数据执行一些计算并将更新的数据写入新文件。输入文件包含大约 5 亿行,因此我尝试尽可能地扩展以下内容,以便在运行它时不会出现内存不足异常。关于如何改进以下内容有什么想法吗?

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


public class CsvTest {

  public void readFile() {

    BufferedReader br = null;
    BufferedWriter out = null;

    try {

      br = new BufferedReader(new FileReader("C:\\input.txt"));
      FileWriter fstream = new FileWriter("C:\\output.txt");
      out = new BufferedWriter(fstream);

      String line = null;

      while ((line = br.readLine()) != null) {
        out.write(line + "\r\n");
      }
    }
    catch (FileNotFoundException ex) {
        System.err.println("Error: " + ex.getMessage());
    }
    catch (IOException ex) {
        System.err.println("Error: " + ex.getMessage());
    }
    finally {
      try {
        if (br != null) {
            br.close();
        }
        if(out != null){
            out.close();
        }
      }
      catch (IOException ex) {
          System.err.println("Error: " + ex.getMessage());
      }
    }
  }

  public static void main(String[] args) {
    CsvTest test = new CsvTest();
    test.readFile();
  }
}

最佳答案

你的代码非常好,我的意思是你将数据从输入流式传输到内存中仅保留一行的输出,所以就内存要求而言基本上是 O(1),你不能得到比这更好的了我认为。

缓冲读取器和缓冲写入器中的缓冲区是恒定的,相对于多 GB 文件的大小,内存使用量可以忽略不计。

编辑:垃圾收集器应该可以很好地收集未使用的数据,至少我在类似的数据处理情况下的经验是非常积极的。

关于java - 缩放文本文件 IO 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13653729/

相关文章:

java - NoClassDefFoundError : javax. xml.bind.DatatypeConverter

java - 如何建立 Android Studio 与 mongoDB 的连接?

c# - 为什么 Java 不在其语言语法中使用 out 参数,而 c# 使用?

java - 查找包含 1 到 100 之间数字的 vector 中重复的数字

java - 使用 Java 将命令行输出写入文件

java - Button 类型未定义方法 setOnAction((<no type> e) -> {})

java - 从数组中删除左侧重复项

java - TestNG/万无一失 : How to generate an XML report after each test?

java - JAX-RS、 jackson 和 JodaTime : not working automatic configuration

java 打开的文件未清理,即使进程被终止