行为差异:Intellij与Eclipse

时间:2015-06-09 09:08:35

标签: java eclipse intellij-idea

我正在尝试将现有的和正在运行的Java代码导入并运行到Intellij中,但我遇到了一些问题,这使我在这里写下这个问题:

我的Storm拓扑(java)代码正在从Websphere MQ读取数据,并且收到的消息是一个字节流,并由“Message Parser”项目解析;它解析这些字节流“字符串”并根据某些规则生成有意义的消息。

当我在Eclipse中运行它时没有任何问题,但是在Intellij中它显示了与消息解析器相关的问题。我将其视为编码问题并尝试:

  • 将代码文件编码更改为UTF-8
  • 将行分隔符更改为相同(Unix)

但这并没有让我解决问题。

因为您在Java IDE中都有很好的专业知识,所以我希望您必须多次遇到IDE的Java代码兼容性问题。 如果有任何方法可以解决这个问题,请告诉我。

出现问题的代码如下:

public void execute(Tuple input) {

    String strMessage = null;
    Message posMsg = null;
                Object jmsMsg = input.getValueByField(FieldEnum.FIELD_MESSAGE
                .getFieldName());
        posMsg = ((JMSMessage) jmsMsg);
        strMessage = convertStreamToString(posMsg);

        System.out.println("Message recieved from MQ : "+ strMessage);

        @SuppressWarnings("rawtypes")
        Map parsedSegments = MessageParser.instance().parseMessage(
                strMessage);

        @SuppressWarnings("serial")
        Type nposMessageType = new TypeToken<Map<String, Map<String, String>>>() {
        }.getType();
        String segmentsJson = gson.toJson(parsedSegments, nposMessageType);

        System.out.println(" testing the messages "+segmentsJson);
MessageDetail MessageDetail = new MessageDetail(
                Constant.TOPOLOGY_NAME, segmentsJson);
        this.outputCollector.emit(Constant.STREAM_MSG_PARSER_SUCCESS,
                new Values(MessageDetail));
        this.outputCollector.ack(input);
}


        /**
 * Convert stream to string
 * 
 * @param jmsMsg
 * @return
 * @throws Exception
 */
private static String convertStreamToString(final Message jmsMsg) throws Exception {
    String stringMessage = "";
    BytesMessage bMsg = (BytesMessage) jmsMsg;
    byte[] buffer = new byte[40620];
    int byteRead;
    ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream();
    while ((byteRead = bMsg.readBytes(buffer)) != -1) {
        bout.write(buffer, 0, byteRead);
    }
    bout.flush();
    stringMessage = new String(bout.toByteArray());
    bout.close();
    return stringMessage;
}

1 个答案:

答案 0 :(得分:2)

你的代码应该受到指责。你正在使用

new String(bout.toByteArray());

将字节转换为字符。它使用平台默认编码。从Eclipse运行时与使用IntelliJ运行时不同,因为IntelliJ,如果我没有弄错,会传递一个JVM选项,强制默认编码为UTF-8。

但这不是IntelliJ问题。如果您在任何IDE上运行程序,在默认编码为UTF-8(例如Linux和Mac)的平台上,您的代码将以相同的方式失败。

每次将字节转换为字符,反之亦然,请确保明确指定编码。如果MQ正在生成消息,请阅读其文档以了解它使用的编码,并确保使用相同的编码。例如,如果是ISO-8859-1,请使用

new String(bytes, StandardCharsets.ISO_8859_1)