【问题标题】:Send a list from Erlang to Java using JInterface使用 JInterface 将列表从 Erlang 发送到 Java
【发布时间】:2016-04-23 02:22:57
【问题描述】:

我正在编写一个程序,需要使用 JInterface 在 Java 和 Erlang 之间进行通信。 我在从 Erlang 进程接收列表时遇到问题——不知何故,我在 Java 中得到的对象不是 OtpErlangList 而是 OtpErlangString,如果我尝试将接收到的对象强制转换为 OtpErlangList,则会出现强制转换异常。我试过解码字符串,但似乎不是这样。

在我看来,无法将列表从 Erlang 发送到 Java 很奇怪,如果我没有犯任何基本错误,请你看看吗?

Java 片段:

OtpErlangObject erlangObject = mailbox.receive();
OtpErlangList erlangList = (OtpErlangList) erlangObject;
System.out.println(erlangList.toString());

Erlang 片段:

List = [1, 2, 3, 4],
JavaPid ! List

我将省略其余代码,因为我认为这些是问题所在 - 我已经尝试过其他类并且它有效。

【问题讨论】:

    标签: java concurrency erlang jinterface


    【解决方案1】:

    来自Jinterface 文档:

    Erlang 中的列表也用于描述可打印字符(字符串)的序列。提供了一个便利类 OtpErlangString 来表示 Erlang 字符串。

    获取字符串

    要在 Java 端获取可打印字符的字符串,您应该使用 stringValue() 方法,它将整数列表转换为 Unicode 字符串并返回 java.lang.String 对象。

    Erlang 方面:

    List = "hey" = [$h, $e, $y] = [104, 101, 121],
    JavaPid ! List
    

    Java 端:

    OtpErlangObject erlangObject = mailbox.receive();
    OtpErlangList erlangList = (OtpErlangList) erlangObject;
    System.out.println(erlangList.stringValue());
    

    获取数组

    为了在 Java 端获取元素列表,您应该使用 elements() 方法,该方法返回一个包含所有列表元素的数组。这样,数组的每个元素都是 OtpErlangObject 类型的对象。

    Erlang 方面:

    List = [1, 2, 3, 4],
    JavaPid ! List
    

    Java 端:

    OtpErlangObject erlangObject = mailbox.receive();
    OtpErlangList erlangList = (OtpErlangList) erlangObject;    
    for(OtpErlangObject element : erlangList.elements()) {
        // do something with element
    }
    

    【讨论】:

      【解决方案2】:

      在erlang中,字符串只是一个小整数数组。例如在 erlang shell 中,

      1> A = "abcdefgh".
      "abcdefgh"
      2> A ++ [1024].
      [97,98,99,100,101,102,103,104,1024]
      3> A ++ [105].
      "abcdefghi"
      

      所以我的猜测是这种列表在 Java 端总是被解释为字符串。

      【讨论】:

        【解决方案3】:

        感谢 J.J. Hakala 示例,答案是,如果您发送的列表仅包含可以解释为 ASCII 代码的整数,Java 正是这样做的 - 将其解释为 ASCII 代码数组,也就是字符串:

                    OtpErlangObject erlangObject = mailbox.receive();
        
                    if (erlangObject instanceof OtpErlangString) {
                        OtpErlangString string = (OtpErlangString) erlangObject;
                        for(char c: string.stringValue().toCharArray()) {
                            int num = (int) c;
                            System.out.println(num);
                        }
                    }
        

        【讨论】:

          猜你喜欢
          • 2020-04-13
          • 2017-12-04
          • 2013-02-17
          • 2016-09-02
          • 2020-03-15
          • 2010-09-21
          • 1970-01-01
          • 2015-07-01
          • 2013-03-24
          相关资源
          最近更新 更多