【问题标题】:Strange behaviour of readline in Java/ScalaJava / Scala中readline的奇怪行为
【发布时间】:2013-05-02 23:29:41
【问题描述】:

我遇到了一个非常奇怪的问题。我正在尝试读取我正在执行的命令的结果。代码永远不会到达 println 语句。如果达到输出的结尾,它只是“挂起”程序。没有失败,也没有例外。

我的项目是 Scala 和 Java 的混合体。因此,解决方案使用哪种语言并不重要。我都试过了。我项目的编码是Cp1252。

这是我的代码

var fileScript = Runtime.getRuntime().exec(PathOfScript)
var isr:InputStreamReader  = new InputStreamReader(fileScript.getInputStream())
var in = new BufferedReader(isr)
var line:String = ""
try {
  while ({line = in.readLine();  line!= null}) {
    println("line: "+line)
  }
  println("OUTSIDE !!!");
  in.close();
}

【问题讨论】:

  • 脚本过程真的完成了吗?你确定它输出的是标准输出而不是标准错误吗?
  • PathOfScript 变量包含什么?非常好?
  • 路径是“c:\\nusmv\\nusmv -source script.cmd”。整个输出都可以通过代码访问......如果它到达终点,它只是“挂断”。所以它认为,一切都在标准输出中。

标签: java scala bufferedreader readline inputstreamreader


【解决方案1】:

这很奇怪……我的 Java 版本运行良好:

        InputStreamReader isr = new InputStreamReader(new FileInputStream("c:\\anyfile"));
        BufferedReader in = new BufferedReader(isr);
        String line = "";
        try {
          while ((line = in.readLine()) != null) {
            System.out.println("line: "+line);
          }
          System.out.println("OUTSIDE !!!");
          in.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

我认为问题出在 fileScript 中:如果它提供了一个流并且没有关闭它,那么您将永远不会在 while 循环中获得 null。检查那部分。尝试使用常规文件(就像我在示例中所做的那样)。如果它有效,那么问题肯定出在 fileScript 对象中。

【讨论】:

  • 是的,没错,但我不能使用它。我可以使用脚本中的选项将输出保存到文件中并读取文件。然后一切都很好。问题是,将输出写入文件需要一段时间。我正在检查许多脚本。是否有解决方案来检查文件是否已经写入,没有线程?如果我检查 file.exists(),我得到的反馈是错误的。如果我等待几毫秒,它似乎没问题。但是,如果代码将用于速度较慢的系统,我无法确定它是否有效。
  • 你能用下面的命令试试吗(或者,如果你有linux,ls): InputStreamReader isr = new InputStreamReader(Runtime.getRuntime().exec("cmd /c dir").getInputStream ());
  • 是的,行得通。所以问题是我的脚本的输出?我要提前感谢您 Igor,感谢您的帮助。
  • 没问题,是的,我认为问题出在您正在运行的脚本中。我想,它不再是 Java 线程了,祝你进一步调查好运! :)
  • 是脚本。谢谢!
猜你喜欢
  • 2023-03-31
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多