如何将Scala数组[Byte]转换为Java byte []?

时间:2014-03-13 13:42:48

标签: java scala interop language-interoperability

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

斯卡拉演员:

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 Actor:

/**
 * {@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?

3 个答案:

答案 0 :(得分:19)

Scala的Array[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]

答案 1 :(得分:0)

我没有看到Scala中的tell方法使用stdout。它发送一个Any,而Java中的onReceive需要一个Object。您需要做的就是检查您的Java onReceive,如下所示:

public void onReceive(Object object) throws Exception {

    if (object instanceof byte[]) {

        doSomething();
    }
    else if....

答案 2 :(得分:-1)

既然你所说的是有效的(考虑到我检查的所有来源 - 它是),这也应该有效:

Java调用:

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

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

但是,在Java方法 loadFile()中,我得到:

incompatible types: Array cannot be converted to byte[]