【发布时间】:2012-08-02 20:25:33
【问题描述】:
有没有办法让 java 中的一个线程对某些 FileInputStream 或类似内容进行读取调用,并让第二个线程同时处理正在加载的字节? 我已经尝试了很多东西 - 我目前的尝试有一个线程运行这个:
FileChannel inStream;
try {
inStream = (new FileInputStream(inFile)).getChannel();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
int result;
try {
result = inStream.read(inBuffer);
} ...
第二个线程想要在加载字节时访问它们。显然,第一个线程中的读取调用会阻塞,直到缓冲区已满,但我希望能够在该点之前访问加载到缓冲区中的字节。目前,我尝试的所有东西都有缓冲区,并且它的支持数组在读取完成之前保持不变 - 这不仅破坏了这个线程的要点,而且还表明数据正在某个地方加载到某个中间缓冲区,然后稍后复制到我的缓冲区中,这似乎愚蠢。
一种选择是对数组进行一系列较小的读取,并在后续读取时使用偏移量,但这会增加额外的开销。
有什么想法吗?
【问题讨论】:
-
我考虑的另一个选项是使用 PipedInput/Output 流。这似乎可能会起作用,但这样做会增加开销 - 为什么我不能让我的 Filechannel 或 FileInputStream “流”到我的 ByteBuffer 或某个字节数组中?
-
“显然第一个线程中的读取调用会阻塞,直到缓冲区已满”它不应该。对
read()的调用应该阻塞,直到数据可用。 (操作系统的 IO 子系统负责将数据传送到特定于流的缓冲区。)另外,为什么在这个用例中使用 NIO?您似乎没有在任何地方使用它的功能。 -
它不会“在缓冲区满之前阻塞”。它从流中读取至少一个字节,阻塞直到至少一个字节可用。无论如何,因为它是一个文件,所以基本上没有真正的阻塞。你不需要两个线程来解决这个问题。第二个必须阻止第一个,第一个必须阻止输入。没有任何收获。
标签: java multithreading asynchronous io filechannel