【发布时间】:2018-05-02 11:27:25
【问题描述】:
我正在尝试从线程中的 InputStream 中读取数据。
线程应该运行的类如下所示
static private class Runner implements Runnable {
private InputStream fis;
private OutputStream fos;
public Runner(InputStream fis, OutputStream fos) throws IOException {
int blu = fis.available();
System.out.println(blu);
this.fis = fis;
int bla = this.fis.available();
System.out.println(bla);
this.fos = fos;
}
@Override
public void run() {
try {
int bla = fis.available();
System.out.println(bla);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(fis);
System.out.println(fos);
}
}
线程是这样创建的
final Runnable runnable = new Runner(fis, fos);
final Thread thread = new Thread(runnable);
thread.start();
并且在 Thread 上应该运行 run 方法。但是一旦执行,我就会收到错误
java.nio.channels.ClosedChannelException
我调试了它,InputStream 设置为关闭。
为什么 InputStream 会在 Thread 中关闭?我应该使用其他替代方法吗?
编辑:
我忘了提到它们是在这样的 try 块中打开的,然后主要功能就结束了。
try (InputStream fis = Files.newInputStream(sourcePath)) {
try (OutputStream fos = Files.newOutputStream(sinkPath)) {
final Runnable runnable = new Runner(fis, fos);
final Thread thread = new Thread(runnable);
thread.start();
}
}
【问题讨论】:
-
您发送的代码没有关闭。流从哪里来?
-
我添加了更多代码。主线程是否已经关闭它们,因为该块已运行,因此可以释放它们?
-
是的,您的最新代码显示了您的错误。 1+给回答者。删除我之前的评论。将来,请考虑创建和发布Minimal, Complete, and Verifiable Example Program,以便我们可以更快地回复您,而无需从您那里提取更多信息。祝你好运。
标签: java multithreading io