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

3

13

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?
Anselmi answered 13/3, 2014 at 13:42 Comment(2)
Are they different? I thought you could access Scala objects from Java since they're both JVM technologies. What have you tried? If you're trying to pass strings, can you pass a char[] array?Bacterium
I could send Strings and it is no problem. However, the Scala actor that sends the Array[Byte] is generic because it just takes the stdout of any command. In some use-cases the output is String as in this case but the Actor could be used in other contexts where the output of a process is binary, too.Anselmi
B
26

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]
Bustee answered 13/3, 2014 at 13:49 Comment(3)
That's what I thought.Bacterium
It seems you actually need something like Array[Byte](1.toByte, ...) etc because Array[Byte] won't take an Int literal.Dukie
But what if the method is void doSmth(byte[] arr) ? What would do to a before passing it to the method?Saxe
B
0

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....
Bacterium answered 13/3, 2014 at 14:29 Comment(0)
B
-2

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[]
Baize answered 27/4, 2015 at 12:36 Comment(1)
If you have a problem, which you seem to have from your final two lines, you should ask it as a new question, not post it as an answer. You can include a link to this question if you feel it helps explain your question (use the share link under the question).Shockley

© 2022 - 2024 — McMap. All rights reserved.