Java InputStream在Thread中关闭

我试图从线程中的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);

    }

}

Thread就是这样创建的

final Runnable runnable = new Runner(fis,fos);
final Thread thread = new Thread(runnable);
thread.start();

并且在线程上应该运行run方法.但是一旦执行它就会得到错误

java.nio.channels.ClosedChannelException

我调试了它,InputStream设置为关闭.

为什么在Thread中关闭InputStream?有没有我应该使用的替代方案?

编辑:

我忘了提到它们是在这样的试块中打开的,之后主要功能就结束了.

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块将关闭它们各自的流.当您只计划使用块内的流时,这很好.但是因为你想在块结束后继续在另一个线程中使用流,所以去除块.

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中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...