Java: мне нужно получить байтовый массив из outputtream

В моем случае выходной поток - это в основном FileOutputStream. Следовательно для этого кода:

ByteArrayOutputStream bos = (ByteArrayOutputStream) streamToEncrypt;

(Где streamToEncrypt это OutputStream) получает это исключение:

java.lang.ClassCastException: java.io.FileOutputStream cannot be cast to java.io.ByteArrayOutputStream

Все, что мне нужно сделать, это получить массив байтов из этого выходного потока. У меня нет доступа к файлу на этом уровне. Все, что у меня есть, это поток вывода, который я должен зашифровать, прежде чем отправить его в файл

2 ответа

Решение

Вы не получаете байты из OutputStream, Вы получаете их из InputStream, Вы положили байты в OutputStream,

Если байты уже записаны в OutputStream, слишком поздно. Повторное открытие файла и чтение из него - единственный доступ к этим данным.

Если вы хотите зашифровать выходной поток, вы должны создать поток и передать его коду, который записывает в поток.

Cipher enc = Cipher.getInstance("...");
enc.init(...);
try (OutputStream fos = Files.newOutputStream(path);
     OutputStream os = new CipherOutputStream(fos, enc)) {
   writingObject.write(os);
}

Это просто не имеет никакого смысла.

ByteArrayOutputStream берет данные, которые вы вставляете в него... и сохраняет их в байтовом массиве, который вы можете получить позже.

FileOutputStream принимает данные... и помещает их в файл.

Это два совершенно разных класса; Вы просто не можете бросить одно в другое! То же самое, что вы пытаетесь привести строку в целое число; или превратить яблоко в банан, сказав: "Ты яблоко, теперь будь бананом". Просто не будет работать!

Итак, настоящий "ответ" здесь: вы должны сделать шаг назад и уточнить, что именно вы собираетесь делать со своими данными; и затем вы используете этот поток (ы), соответствующий этим требованиям.

Другие вопросы по тегам