加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java InputStream在Thread中关闭

发布时间:2020-12-15 04:26:56 所属栏目:Java 来源:网络整理
导读:我试图从线程中的InputStream读取. Thread应该运行的类看起来像这样 static private class Runner implements Runnable { private InputStream fis; private OutputStream fos; public Runner(InputStream fis,OutputStream fos) throws IOException { int b
我试图从线程中的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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读