java - 更快地读取大文本文件

标签 java bufferedreader

我正在尝试尽可能快地读取一个大文本文件。

  • 不以“!”开头的行被忽略了。
  • 具有 8 个 CSV 的行已删除其最后一个值。
  • 值中永远不会有“,”(不需要使用 opencsv)。
  • 所有内容都添加到稍后解码的长字符串中。

这是我的代码

BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\Documents\\ais_messages1.3.txt")); 
String line, aisLines="", cvsSplitBy = ",";
try {
   while ((line = br.readLine()) != null) {
      if(line.charAt(0) == '!') {
         String[] cols = line.split(cvsSplitBy);
         if(cols.length>=8) {
            line = ""; 
            for(int i=0; i<cols.length-1; i++) {
               if(i == cols.length-2) {
                  line = line + cols[i]; 
               } else {
                  line = line + cols[i] + ","; 
               } 
            }
            aisLines += line + "\n";
         } else {
            aisLines += line + "\n"; 
         }
      }
   }
} catch (IOException e) {
   e.printStackTrace();
}

所以现在它在 14 秒内读取了 36890 行。我还尝试了 InputStreamReader:

InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\\Users\\Documents\\ais_messages1.3.txt"));
    BufferedReader br = new BufferedReader(isr);

并且花费了相同的时间。有没有更快的方法来读取大型文本文件(100,000 或 1,000,000 行)?

最佳答案

停止尝试建立 aisLines作为一个大字符串。使用ArrayList<String>您将这些行附加到。在我的机器上,这需要 0.6% 的时间作为你的方法。 (这段代码在 0.75 秒内处理了 1,000,000 条简单的行。)它会减少以后处理数据所需的工作量,因为它已经按行拆分了。

BufferedReader br = new BufferedReader(new FileReader("data.txt"));
List<String> aisLines = new ArrayList<String>();
String line, cvsSplitBy = ",";
try {
    while ((line = br.readLine()) != null) {
        if(line.charAt(0) == '!') {
            String[] cols = line.split(cvsSplitBy);
            if(cols.length>=8) {
                line = "";
                for(int i=0; i<cols.length-1; i++) {
                    if(i == cols.length-2) {
                        line = line + cols[i];
                    } else {
                        line = line + cols[i] + ",";
                    }
                }
                aisLines.add(line);
            } else {
                aisLines.add(line);
            }
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

如果你真的想要一个大的String最后(因为你正在与其他人的代码交互,或其他),转换 ArrayList 仍然会更快回到一个单一的字符串,而不是做你正在做的事情。

关于java - 更快地读取大文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30442188/

相关文章:

java - 在流操作中使用方法引用和函数对象之间的区别?

java Process,getInputStream,仅读取最新行

Java BufferedReader

java - 用偶数和奇数分隔文件中的行

Java,从文件中读取对象并将它们添加到数组列表中

java - 是否有理由不使用 BufferedReader 包装 InputStreamReader?

java - openCV 中的 cvtColor 创建拉伸(stretch)图像数组?

java - 在android java中从XML填充ListView

java - Matlab 无法读取 JAR 资源

java - 带有 UIBinder 的 GWT CellTable