gpt4 book ai didi

Java InputStream 在线程中关闭

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:24:53 26 4
gpt4 key购买 nike

我正在尝试从线程中的 InputStream 读取数据。

Thread 应该运行的类如下所示

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 block 中打开的,之后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-with-resources当 block 退出时, block 将关闭它们各自的流。当您只打算使用 block 内的流时,这非常有用。但是,由于您希望在 block 结束后继续在另一个线程中使用流,因此请摆脱 block 。

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();

关于Java InputStream 在线程中关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29709436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com