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

13

我有一个使用Scala编写的Akka应用程序,其中一些角色是用Java编写的。在某些情况下,Scala Actor会写入一个Array [Byte],我需要从Java Actor中反序列化它。在这种使用情况下,我最终需要在Java中获得Array [Byte]的字符串表示,以解决我的问题。

Scala Actor:

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?

它们不同吗?我认为你可以从Java访问Scala对象,因为它们都是JVM技术。你尝试过什么?如果你正在尝试传递字符串,你能传递一个char[]数组吗? - mttdbrd
我可以发送字符串,这没有问题。然而,发送Array[Byte]的Scala actor是通用的,因为它只需要任何命令的stdout。在某些用例中,输出是字符串,就像这种情况一样,但是Actor也可以在其他上下文中使用,其中进程的输出也是二进制的。 - SkyWalker
3个回答

26

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]

那正是我所想的。 - mttdbrd
看起来你实际上需要像Array[Byte](1.toByte, ...)这样的东西,因为Array[Byte]不会接受Int字面量。 - dividebyzero
2
但是如果方法是 void doSmth(byte[] arr) 呢?在将其传递给该方法之前,您会对 a 做什么呢? - mdornfe1

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

既然你所说的是有效的(并且考虑到我检查过的所有来源 - 它是有效的),那么这也应该可以工作:

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[]

1
如果你有问题,从你最后两行看来似乎是这样,你应该将它作为一个新问题提问,而不是将其发布为答案。如果你觉得这有助于解释你的问题,你可以在问题下使用分享链接包含这个问题的链接。 - Bill Woodger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接