13

我有一个 Akka 应用程序,其中包含用 Scala 编写的演员和其他用 Java 编写的演员。在一种情况下,Scala Actor 编写了一个Array[Byte],我需要从 Java Actor 反序列化它。在这个用例中,我最终需要 Java 中的 String 表示形式,Array[Byte]这样也可以解决我的问题。

斯卡拉演员:

val outputStream = new java.io.ByteArrayOutputStream()
val bufferedOutputStream = new java.io.BufferedOutputStream(outputStream, 1024)
val exitCode : Integer = processBuilder #> bufferedOutputStream !
bufferedOutputStream.flush
val content = outputStream.toByteArray // this gives an Array[Byte]
javaActorRef.tell(content, getSelf())

Java 演员:

/**
 * {@inheritDoc}
 */
@Override
public void onReceive(Object object) throws Exception {
    // object has a Scala Array[Byte] how do I convert here to 
    // byte[] or to String?
4

3 回答 3

24

ScalaArray[Byte]已经是 Java 的byte[]. 证明:

object ScalaSide extends Application {
  val a = Array[Byte](1, 2, 3)

  JavaSide.doSmth(a)
}

--

import java.util.Arrays;

public class JavaSide {
    public static void doSmth(Object arr) {
        byte[] b = (byte[]) arr;
        System.out.println(Arrays.toString(b));
    }
} 

结果:

[1, 2, 3]
于 2014-03-13T13:49:51.807 回答
0

我没有看到 Scala 中的 tell 方法使用标准输出。它发送一个 Any 并且 Java 中的 onReceive 接受一个对象。您需要做的就是像这样检查您的 Java onReceive:

public void onReceive(Object object) throws Exception {

    if (object instanceof byte[]) {

        doSomething();
    }
    else if....
于 2014-03-13T14:29:38.507 回答
-1

Since what you said is valid (and considering all sources I checked - it is), this should work as well:

Java call:

private byte[] loadFile() throws FileNotFoundException, IOException {
    return FileLoader.loadBytesFromFile(fileToLoad);
}

of Scala method:

def loadBytesFromFile(fileToLoad: File): Array[Byte] = {
    return Source.fromFile(fileToLoad).map(_.toByte).toArray
}

However, inside the Java method loadFile() I get:

incompatible types: Array cannot be converted to byte[]
于 2015-04-27T12:36:39.597 回答