Как преобразовать массив Scala Array [Byte] в Java []? - программирование
Подтвердить что ты не робот

Как преобразовать массив Scala Array [Byte] в Java []?

У меня есть приложение Akka с актерами, написанными в Scala и другие на Java. В одном случае актер Scala записывает Array[Byte], и мне нужно десериализовать это из Java-актера. В этом случае я в конечном итоге нуждаюсь в представлении String в Java из Array[Byte], чтобы также решить мою проблему.

Scala Актер:

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?
4b9b3361

Ответ 1

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]

Ответ 2

Я не вижу, чтобы метод tell в Scala использовал stdout. Он отправляет Any, а onReceive в Java принимает объект. Все, что вам нужно сделать, это проверить свою Java onReceive следующим образом:

public void onReceive(Object object) throws Exception {

    if (object instanceof byte[]) {

        doSomething();
    }
    else if....

Ответ 3

Так как то, что вы сказали, действительно (и учитывая все источники, которые я проверил - это так), это также должно работать:

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