Java InputStream 在线程中关闭
Java InputStream closed in Thread
我正在尝试从线程中的 InputStream 中读取。
线程应该运行的class看起来像这样
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 上应该 运行 运行 方法。但是一旦执行,我就会得到 Error
java.nio.channels.ClosedChannelException
我调试了它,InputStream 设置为关闭。
为什么 InputStream 在 Thread 中关闭?我应该使用替代方案吗?
编辑:
忘了说了,它们是这样在一个try块中打开的,之后main函数就结束了。
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();
}
}
因为您在 Try 中拥有它,所以当线程离开 try 块时它会关闭。 Thread.start() 不会挂起,因此会自动关闭。
这样做:
InputStream fis = Files.newInputStream (sourcePath);
OutputStream fos = Files.newOutputStream(sinkPath);
final Runnable runnable = new Runner(fis, fos);
final Thread thread = new Thread(runnable);
thread.start();
在你的话题中:
public void run() {
try {
int bla = fis.available();
System.out.println(bla);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
System.out.println(fis);
System.out.println(fos);
fis.close();
fis.close();
}
}
那些try-with-resources块将在块退出时关闭它们各自的流。当您只打算使用块内的流时,这非常有用。但是,由于您想在块结束后继续在另一个线程中使用流,因此请摆脱块。
InputStream fis = Files.newInputStream (sourcePath);
OutputStream fos = Files.newOutputStream(sinkPath);
final Runnable runnable = new Runner(fis, fos);
final Thread thread = new Thread(runnable);
thread.start();
我正在尝试从线程中的 InputStream 中读取。
线程应该运行的class看起来像这样
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 上应该 运行 运行 方法。但是一旦执行,我就会得到 Error
java.nio.channels.ClosedChannelException
我调试了它,InputStream 设置为关闭。
为什么 InputStream 在 Thread 中关闭?我应该使用替代方案吗?
编辑:
忘了说了,它们是这样在一个try块中打开的,之后main函数就结束了。
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();
}
}
因为您在 Try 中拥有它,所以当线程离开 try 块时它会关闭。 Thread.start() 不会挂起,因此会自动关闭。
这样做:
InputStream fis = Files.newInputStream (sourcePath);
OutputStream fos = Files.newOutputStream(sinkPath);
final Runnable runnable = new Runner(fis, fos);
final Thread thread = new Thread(runnable);
thread.start();
在你的话题中:
public void run() {
try {
int bla = fis.available();
System.out.println(bla);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
System.out.println(fis);
System.out.println(fos);
fis.close();
fis.close();
}
}
那些try-with-resources块将在块退出时关闭它们各自的流。当您只打算使用块内的流时,这非常有用。但是,由于您想在块结束后继续在另一个线程中使用流,因此请摆脱块。
InputStream fis = Files.newInputStream (sourcePath);
OutputStream fos = Files.newOutputStream(sinkPath);
final Runnable runnable = new Runner(fis, fos);
final Thread thread = new Thread(runnable);
thread.start();