【问题标题】:Why is neccsary to add \n and \r when sending input to a running process?为什么在向正在运行的进程发送输入时需要添加 \n 和 \r?
【发布时间】:2014-01-10 15:39:19
【问题描述】:

我正在尝试将 Java from 添加到 Visual Prolog 生成的可执行文件中,方法是将其作为进程运行。

我已经使用this answer来实现进程交互。我的 Visual Prolog 需要来自命令行的数字,它甚至会验证它(无论它是否是 Prolog 术语),但是从 Java 运行时,它不会将输入识别为有效。那些转义字符会将我的号码变成字符串吗?

当我尝试删除它们时,我的 Java 程序挂起并且 Visual Prolog 可执行文件没有响应。我认为这就像按下回车键。

【问题讨论】:

  • 这似乎是 Visual Prolog 的问题,因为 Visual Prolog 可执行文件本身运行正常,并且界面正在正确发送数字,但不知何故 Visual Prolog 在我的自定义函数或 toTerm 中无法正确识别/1。感谢cmets。但我不确定我是否应该删除这个问题......

标签: java command-line process visual-prolog


【解决方案1】:

\r\n 在 Windows 中是 EOL (end-of-line) sequence

如果输入是面向行读取的,那么在发送 EOL(或 EOF)之前,消费代码不会处理该行 - 这将使消费者看起来“挂起”,而实际上它是只是耐心地等待线路的其余部分。考虑 Java 中的 Scanner.nextLine:nextLine 在整行准备好之前不会返回

解决方案:发送带有适当输入的 EOL 到 Visual Prolog;或关闭输入流。


另请参阅"line.separator",也许。但是,各种println (print line) 方法应该已经包含相应的 EOL。

【讨论】:

    【解决方案2】:

    \r 是回车 CR \n 是换行 LF

    许多文本协议要求您使用 CR+LF,有些需要在 LF 上识别。

    这就像在 Windows 中的文本中开始一个换行符

    【讨论】:

      【解决方案3】:

      当且仅当目标进程需要它时才需要它。

      您声明您的进程“需要命令行中的数字”,但如果您通过其“标准输入”向它提供输入,则情况并非如此。

      相反,它似乎需要通过输入到控制台的行来输入数字。

      在任何一种情况下,“行”一词都表示需要行终止符。

      【讨论】:

        【解决方案4】:

        引用的示例是使用管道(重定向标准输入和标准输出)在进程之间进行通信,但您说您的程序需要命令行上的数字。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-15
          • 1970-01-01
          • 2015-03-30
          相关资源
          最近更新 更多