【问题标题】:How to convert a Scala Array[Byte] to Java byte[]?如何将 Scala Array[Byte] 转换为 Java byte[]?
【发布时间】:2014-04-18 07:08:06
【问题描述】:

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

斯卡拉演员:

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?

【问题讨论】:

  • 它们有什么不同吗?我认为您可以从 Java 访问 Scala 对象,因为它们都是 JVM 技术。你试过什么?如果你想传递字符串,你能传递一个 char[] 数组吗?
  • 我可以发送字符串,这没问题。但是,发送 Array[Byte] 的 Scala 角色是通用的,因为它只接受任何命令的标准输出。在某些用例中,输出为字符串,如本例所示,但 Actor 也可用于进程输出为二进制的其他上下文。

标签: java scala interop language-interoperability


【解决方案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[]

【讨论】:

  • 如果您有问题,您似乎在最后两行中遇到了问题,您应该将其作为一个新问题提出,而不是作为答案发布。如果您认为该问题有助于解释您的问题,您可以添加指向该问题的链接(使用问题下方的分享链接)。
【解决方案2】:

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

public void onReceive(Object object) throws Exception {

    if (object instanceof byte[]) {

        doSomething();
    }
    else if....

【讨论】:

    【解决方案3】:

    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]
    

    【讨论】:

    • 我是这么想的。
    • 看来你实际上需要像 Array[Byte](1.toByte, ...) 之类的东西,因为 Array[Byte] 不会采用 Int 文字。
    • 但是如果方法是 void doSmth(byte[] arr) 呢?在将 a 传递给方法之前会做什么?
    猜你喜欢
    • 2023-01-21
    • 2019-04-04
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2020-04-27
    • 2020-01-08
    • 2021-08-28
    相关资源
    最近更新 更多