设置从阅读器读取的字符数限制

时间:2018-10-16 23:18:48

标签: java file

我正在尝试实现一个多线程文件读取器,其中每个线程从同一文件中读取大量字节。 我在每个线程中初始化Reader,并相应地初始化skip,但是我的Reader被另一个库(CsvMapReader)使用,并且我希望线程仅读取{{ 1}}个字节。如何确保传递给chunk的{​​{1}}对象只能读取Reader个字节,直到EOF为止。

示例:

CsvMapReader

假设,我有多个线程,每个线程都跳过chunk的某个倍数。基本上,我只想循环处理Thread reader = new Thread(() -> { BufferedReader br = new BufferedReader("large_file"); br.skip(chunkSize); CsvMapReader leftFileReader = new CsvMapReader(br, filePreference); while (csvMapReader.read() != null) { /* This loop should only iterate until chunksize bytes are processed, and no more */ // do something } }) reader.start(); 个字节。

2 个答案:

答案 0 :(得分:1)

您可以尝试以下代码。您可以使用一个计数器变量来计算已读取和只读的字符,直到达到chunkSize为止。另外,我假设你的chunkSize是  字符大小,因为您使用的是Reader而不是inputStream。

    Thread reader = new Thread(() -> {
       BufferedReader br = new BufferedReader("large_file");
         br.skip(chunkSize);
          CsvMapReader leftFileReader =
                 new CsvMapReader(br, filePreference);
            int chunkSizeCounter=0;
            while (csvMapReader.read() != null && 
                        chunkSizeCounter< chunkSize ) {
                         // do something
                      chunkSizeCounter++;
             }
          })
         reader.start();

您还可以读取每个线程的特定行,而不是读取每个线程的特定字节或字符。阅读行时,您对尺寸的检查较少,可能会更快一些

答案 1 :(得分:0)

能够通过为每个线程创建新的InputStream来解决此问题,因为仅创建BufferedReader会影响所有线程,因为它们共享相同的文件指针。

Thread reader = new Thread(() -> {
  InputStream is = new InputStream("large_file")
  BufferedReader br = new BufferedReader(is);
  is.skip(chunkSize);
  CsvMapReader leftFileReader = new CsvMapReader(br, filePreference);
  while (csvMapReader.read() != null) { /* This loop should only iterate until chunksize bytes are processed, and no more */
    // do something
  }
})
reader.start();