Java InputStream在线程中关闭

Java InputStream在线程中关闭,java,multithreading,io,Java,Multithreading,Io,我正在尝试读取线程中的输入流 线程应该运行的类如下所示 static private class Runner implements Runnable { private InputStream fis; private OutputStream fos; public Runner(InputStream fis, OutputStream fos) throws IOException { int blu = fis.available();

我正在尝试读取线程中的输入流

线程应该运行的类如下所示

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();
并且在线程上应该运行run方法。但一旦它被执行,我就得到了错误

java.nio.channels.ClosedChannelException
我调试了它,InputStream被设置为closed

为什么InputStream在线程中被关闭?我是否应该使用其他方法

编辑:

我忘了提到它们是在这样一个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();
        }

    }

因为它在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();
        }
    }
当块退出时,这些块将关闭各自的流。当您只计划使用块内的流时,这非常好。但是,由于您希望在块结束后继续在另一个线程中使用流,所以请去掉这些块

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

它没有在你发送的代码中关闭。流从哪里来?我添加了更多的代码。主线程是否已经关闭了它们,因为块已运行完毕,因此可以释放它们?是的,您的最新代码显示了您的错误。1+给回答者。删除我先前的评论。在将来,考虑创建和发布A,这样我们可以更快地回答你,而不必从你那里提取更多信息。祝你好运