我正在尝试实现一个多线程文件读取器,其中每个线程从同一文件中读取大量字节。
我在每个线程中初始化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();
个字节。
答案 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();