使用 IBM MQ classes for Java 读取和写入除 MQMessage 对象以外的字节流

当数据源不是 MQMessage 对象时,这些示例使用头类来解析和处理 IBM® MQ 头内容。

即使数据源不是 MQMessage 对象,您也可以使用头类来解析和处理 IBM MQ 头内容。 由每个头类实现的 MQHeader 接口提供了方法 int read (java.io.DataInput message, int encoding, int characterSet)int write (java.io.DataOutput message, int encoding, int characterSet)。 com.ibm.mq.MQMessage 类实现了 java.io.DataInput 和 java.io.DataOutput 接口。 这意味着您可以使用两种 MQHeader 方法读写 MQMessage 内容,从而覆盖在消息描述符中指定的编码和 CCSID。 这对于包含一系列使用不同编码的头的消息非常有用。
您还可以从其他数据流 (例如,文件或套接字流或 JMS 消息中携带的字节数组) 获取 DataInput 和 DataOutput 对象。 java.io.DataInputStream 类实现了 DataInput,java.io.DataOutputStream 类实现了 DataOutput。 此示例从字节数组中读取 IBM MQ 头内容:
import java.io.*;
import com.ibm.mq.headers.*;
...
byte [] bytes = ...
DataInput in = new DataInputStream (new ByteArrayInputStream (bytes));
MQHeaderIterator it = new MQHeaderIterator (in, CMQC.MQENC_NATIVE,
  CMQC.MQCCSI_DEFAULT);
以 MQHeaderIterator 开头的行可以替换为
MQDLH dlh = new MQDLH (in, CMQC.MQENC_NATIVE, CMQC.MQCCSI_DEFAULT);
// or any other header type
以下示例使用 DataOutputStream 将内容写入字节数组:
MQHeader header = ... // Could be any header type
ByteArrayOutputStream out = new ByteArrayOutputStream ();

header.write (new DataOutputStream (out), CMQC.MQENC_NATIVE, CMQC.MQCCSI_DEFAULT);
byte [] bytes = out.toByteArray ();
以这种方式使用流时,请注意要使用正确的编码和 characterSet 自变量值。 读取头时,请指定最初编写字节内容时使用的编码和 CCSID。 编写头时,请指定您要生成的编码和 CCSID。 头类会自动执行数据转换。