Java - 以 10 的批量读取大型 .txt 数据文件

bab*_*bly 3 java file

我有一个大数据文件,比如 dataset.txt,其中数据的格式是 -

1683492079 kyra maharashtra 18/04/2017 10:16:17
1644073389 pam delhi 18/04/2017 10:16:17
.......
Run Code Online (Sandbox Code Playgroud)

这些字段是 id、名称、状态和时间戳。

我在 .txt 数据文件中有大约 50,000 行数据。

我的要求是以 10 的批量大小从此数据文件中读取数据。

所以在第一批中,我需要从 0 到第 9 个元素读取。下一批从第 10 个到第 19 个元素等等......

使用 BufferedReader 我设法读取了整个文件:

import java.io.*;
public class ReadDataFile {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("dataset.txt"));
        String line;
        while((line = br.readLine())!= null)
        {
           System.out.println(line);
        }
        br.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我的要求是以 10 的批处理大小读取文件。我是 Java 新手,所以如果有人能简单地帮助我,我将不胜感激。

根据@GhostCat 的回答——这就是我所得到的——

public class ReadDataFile {
public static void main(String args[]) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader("dataSetExample.txt"));
    readBatch(br,10);       
}

public static void readBatch(BufferedReader reader, int batchSize) throws IOException {
       List<String> result = new ArrayList<>();
       for (int i = 0; i < batchSize; i++) {
         String line = reader.readLine();
         if (line != null) {
         // result.add(line);
             System.out.println(line);
        }
      }
     // return result;
       return ;
    }
}
Run Code Online (Sandbox Code Playgroud)

该文件是在 readBatch 方法中读取的,那么我如何在 main 方法中知道到达文件末尾以调用接下来的 10 条记录?请帮忙。

Gho*_*ica 6

你的要求不是很清楚;但一些简单的事情可以让你开始:

A)你的主要方法不应该做任何阅读;它只是准备那个 BufferedReader 对象

B)您使用该阅读器的方法如下:

private static List<String> readBatch(Reader reader, int batchSize) throws IOException {
   List<String> result = new ArrayList<>();
   for (int i = 0; i < batchSize; i++) {
     String line = reader.readLine();
     if (line != null) {
      result.add(line);
     } else {
      return result;
     }
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

用于您的主要:

BufferedReader reader = ...
int batchSize = 10;
boolean moreLines = true;
while (moreLines) {
  List<String> batch = readBatch(reader, batchSize);
  ... do something with that list
  if (batch.size() < batchSize) {
    moreLines = false;
}
Run Code Online (Sandbox Code Playgroud)

这意味着“建议”您如何处理此问题。我的答案中缺少的东西:可能你应该使用一个不同的类,并在那里进行解析(并返回一个List<DataClass>而不是在那些原始的“行串”周围移动。

当然:50000 行并不是真正的数据。除非我们谈论的是嵌入式设备,否则关于“批处理风格”真的没有什么意义。

最后:术语批处理具有非常独特的含义;也是在 Java 中,如果您打算去那里,请参阅此处以进一步阅读。