【问题标题】:Java InputStream closed in ThreadJava InputStream 在 Thread 中关闭
【发布时间】:2018-05-02 11:27:25
【问题描述】:

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

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

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 块中打开的,然后主要功能就结束了。

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

    }

【问题讨论】:

  • 您发送的代码没有关闭。流从哪里来?
  • 我添加了更多代码。主线程是否已经关闭它们,因为该块已运行,因此可以释放它们?
  • 是的,您的最新代码显示了您的错误。 1+给回答者。删除我之前的评论。将来,请考虑创建和发布Minimal, Complete, and Verifiable Example Program,以便我们可以更快地回复您,而无需从您那里提取更多信息。祝你好运。

标签: java multithreading io


【解决方案1】:

当块退出时,那些try-with-resources 块将关闭它们各自的流。当您只打算使用块内的流时,这非常有用。但是既然你想在blocks结束后继续在另一个线程中使用streams,就把blocks去掉。

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

【讨论】:

    【解决方案2】:

    因为你在 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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2011-10-29
      • 2012-04-06
      • 1970-01-01
      相关资源
      最近更新 更多