在java中读取开放流直到结束

时间:2012-10-30 10:01:24

标签: java inputstream telnet apache-commons-net

我从apache的telnet客户端获取输入流。每次我向telnet客户端发送一个命令,它会将终端输出写回InputStream,但是这个流在telnet会话之前一直保持打开状态。

现在我想要一种方法来读取此流上的数据直到结束。问题已结束无法确定,因为流始终打开。我找到的一种解决方法是读取数据直到遇到特定字符(其中在大多数情况下都是提示)。但是提示会根据命令不断变化,我无法知道命令执行后会发生什么。

在SO上有一个类似的问题,它解释得更好,但没有答案:

Problems with InputStream

请帮忙......

2 个答案:

答案 0 :(得分:0)

你需要产生一个单独的线程来阅读。你不能只是在一个线程上以“乒乓”方式进入,正是因为你面临的原因。

顺便说一下:你现在联系的问题已经得到了答案。它建议不要将CPU驱动到100%负载,这是非常好的建议:)

然而read方法会阻塞,所以你只需将它放入一个线程循环中,并在收到某些内容时回调。结束循环并在IOException或“-1”上终止线程,并幸福地生活在everafter:)

答案 1 :(得分:-1)

最后我确实使用了超时。基本上,我这样做了,如果1秒后字符不可用则放弃。而不是inputStream.read()我使用了这个:

private char readChar(final InputStream in){
        ExecutorService executor = Executors.newFixedThreadPool(1);
        //set the executor thread working
        Callable<Integer> task = new Callable<Integer>() {
            public Integer call() {
               try {
                   return in.read();
               } catch (Exception e) {
                  //do nothing
               }
               return null;
            }
         };

         Future<Integer> future = executor.submit(task);
         Integer result =null;
         try {
              result= future.get(1, TimeUnit.SECONDS); //timeout of 1 sec
          } catch (TimeoutException ex) {
              //do nothing
          } catch (InterruptedException e) {
             // handle the interrupts
          } catch (ExecutionException e) {
             // handle other exceptions
          } finally {
              future.cancel(false);
              executor.shutdownNow();
           }

         if(result==null)
             return (char) -1;
        return  (char) result.intValue();
    }