简体   繁体   中英

How to convert a Scala Array[Byte] to Java byte[]?

I have an Akka application with actors written in Scala and others in Java. In one case a Scala Actor writes an Array[Byte] and I need to deserialize this from a Java Actor. In this use-case I ultimately need a String representation in Java of the Array[Byte] so that would also solve my problem.

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?

Scala's Array[Byte] is already a Java's byte[] . Proof:

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));
    }
} 

Result:

[1, 2, 3]

I don't see that the tell method in Scala uses the stdout. It sends an Any and the onReceive in Java takes an Object. All you need to do is check in your Java onReceive like this:

public void onReceive(Object object) throws Exception {

    if (object instanceof byte[]) {

        doSomething();
    }
    else if....

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM