在 AS400 上通过 Java 流式传输运行时进程执行(cobol obj)的结果时出现 MalformedInputException

Posted

技术标签:

【中文标题】在 AS400 上通过 Java 流式传输运行时进程执行(cobol obj)的结果时出现 MalformedInputException【英文标题】:MalformedInputException while streaming results from Runtime process execution(cobol obj) via Java on AS400 【发布时间】:2012-07-26 10:07:34 【问题描述】:

我正在尝试通过 java 调用一个简单的 Hello World Cobol 程序。 Java 代码在 IFS 文件结构中,而 cobol 对象存放在库中。 我面临多个问题:

    流程执行返回的错误流不是可读格式。 即使 cobol 代码的终止返回 0,我也会收到错误流结果。 我在进程的输入流中看不到 cobol 输出结果。(如果我理解错误流,也许我可以解决这个问题)

cobol 代码在独立调用时起作用。 我尝试过编码 UTF8、UTF16、Cp943 和默认值。 当我使用 UTF8、UTF16 时,我得到 MalformedInputException,否则是垃圾值。

Java 代码:(编译 @AS 400 本身 -java 1.5)

导入java.io.*; 公共类 CallCLPgm 公共静态无效主要(字符串 [] 参数) 尝试 Process theProcess = Runtime.getRuntime().exec("system CALL PROG6"); //错误流 BufferedReader inStream1 = new BufferedReader(new InputStreamReader (theProcess.getErrorStream(),"UTF8")); System.out.println(inStream1.readLine()); inStream1.close(); //输入流 BufferedReader inStream = new BufferedReader(new InputStreamReader (theProcess.getInputStream())); System.out.println(inStream.readLine()); inStream.close(); System.out.println("终止:"+theProcess.waitFor());
 //Cobol code
      PROCEDURE DIVISION.        
      PROGRAM-BEGIN.     
          DISPLAY "Hello World".   
          STOP RUN.  

【问题讨论】:

【参考方案1】:

我应该专注于 IBM 编码格式 http://publib.boulder.ibm.com/html/as400/v4r5/ic2924/index.htm?info/java/rzaha/fileenc.htm

我在美国使用“Cp037”而不是 UTF8 和其他格式。

BufferedReader inStream1 = new BufferedReader(new InputStreamReader (theProcess.getErrorStream(),"Cp037"));

【讨论】:

我可以在 2 天后将其最终确定为接受,因为我回答了我自己的问题,我猜 :) 请注意,为了在国际上正常工作,您必须向服务器询问其编码,并使用它。【参考方案2】:

我不是 Cobol 程序员,但我认为 Cobol 动词 DISPLAY 不会写入标准输出。检查 Cobol 手册,但我猜你需要在 Cobol 程序中实际打开 stdout 并写入它而不是使用 DISPLAY。

当我想调用 IBM i 上的程序时,我使用 JTOpen IBM Toolbox for Java。如果您不熟悉IBM Infocenter,可能很难找到Javadoc。

【讨论】:

我可以使用上面的 java 代码本身读取 cobol 使用 display 吐出的输出。如果您从终端执行此操作,进程对象实际上会返回您将看到的所有输出。 Buck,我在前几世做过 COBOL。 DISPLAY 可以将内容写入 CONSOLE 会话,类似于 REXX 中的 SAY。 JT400 javadoc 也可以在javadoc.midrange.com 以更简单的格式找到。

以上是关于在 AS400 上通过 Java 流式传输运行时进程执行(cobol obj)的结果时出现 MalformedInputException的主要内容,如果未能解决你的问题,请参考以下文章

无法在 SQL 2019 Linux 上使用 PolyBase 通过 ODBC 查询 AS400

tomcat throwing java.net.SocketTimeoutException: null 当应用程序在 elb 后面运行并且响应在 http 上流式传输时

使用 Vue.js 在 Janus 上流式传输

在 iSeries / AS400 上运行 jprofiler 时出现问题

可以通过 Java 中的 Apache TelnetClient 连接到 AS400 吗?

steam流式传输啥意思