使用 JInterface 将列表从 Erlang 发送到 Java
Send a list from Erlang to Java using JInterface
我正在编写一个程序,需要使用 JInterface 在 Java 和 Erlang 之间进行通信。
我在从 Erlang 进程接收列表时遇到问题 - 我在 Java 中获得的对象不是 OtpErlangList 而是 OtpErlangString,如果我尝试将接收到的对象转换为 OtpErlangList,则会出现转换异常。我试过解码字符串,但似乎并非如此。
在我看来,无法将列表从 Erlang 发送到 Java 很奇怪,如果我没有犯任何基本错误,你能帮我看看吗?
Java片段:
OtpErlangObject erlangObject = mailbox.receive();
OtpErlangList erlangList = (OtpErlangList) erlangObject;
System.out.println(erlangList.toString());
二郎片段:
List = [1, 2, 3, 4],
JavaPid ! List
我省略了其余的代码,因为我相信这些是问题所在的行 - 我已经在其他类中尝试过并且它有效。
在 erlang 中,字符串只是一个小整数数组。例如在 erlang shell,
1> A = "abcdefgh".
"abcdefgh"
2> A ++ [1024].
[97,98,99,100,101,102,103,104,1024]
3> A ++ [105].
"abcdefghi"
所以我的猜测是这种列表总是被解释为 Java 端的字符串。
来自 Jinterface 文档:
Lists in Erlang are also used to describe sequences of printable characters (strings). A convenience class OtpErlangString
is provided to represent Erlang strings.
获取字符串
要在 Java 端获取可打印字符的字符串,您应该使用 stringValue()
方法将整数列表转换为 Unicode 字符串和 returns 一个 java.lang.String
对象。
二郎方:
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()
方法,其中 returns 一个包含所有列表元素的数组。这样数组的每个元素都是 OtpErlangObject
.
类型的对象
二郎方:
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
}
感谢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);
}
}
我正在编写一个程序,需要使用 JInterface 在 Java 和 Erlang 之间进行通信。 我在从 Erlang 进程接收列表时遇到问题 - 我在 Java 中获得的对象不是 OtpErlangList 而是 OtpErlangString,如果我尝试将接收到的对象转换为 OtpErlangList,则会出现转换异常。我试过解码字符串,但似乎并非如此。
在我看来,无法将列表从 Erlang 发送到 Java 很奇怪,如果我没有犯任何基本错误,你能帮我看看吗?
Java片段:
OtpErlangObject erlangObject = mailbox.receive();
OtpErlangList erlangList = (OtpErlangList) erlangObject;
System.out.println(erlangList.toString());
二郎片段:
List = [1, 2, 3, 4],
JavaPid ! List
我省略了其余的代码,因为我相信这些是问题所在的行 - 我已经在其他类中尝试过并且它有效。
在 erlang 中,字符串只是一个小整数数组。例如在 erlang shell,
1> A = "abcdefgh".
"abcdefgh"
2> A ++ [1024].
[97,98,99,100,101,102,103,104,1024]
3> A ++ [105].
"abcdefghi"
所以我的猜测是这种列表总是被解释为 Java 端的字符串。
来自 Jinterface 文档:
Lists in Erlang are also used to describe sequences of printable characters (strings). A convenience class
OtpErlangString
is provided to represent Erlang strings.
获取字符串
要在 Java 端获取可打印字符的字符串,您应该使用 stringValue()
方法将整数列表转换为 Unicode 字符串和 returns 一个 java.lang.String
对象。
二郎方:
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()
方法,其中 returns 一个包含所有列表元素的数组。这样数组的每个元素都是 OtpErlangObject
.
二郎方:
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
}
感谢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);
}
}