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 принимает данные... и помещает их в файл.
Это два совершенно разных класса; Вы просто не можете бросить одно в другое! То же самое, что вы пытаетесь привести строку в целое число; или превратить яблоко в банан, сказав: "Ты яблоко, теперь будь бананом". Просто не будет работать!
Итак, настоящий "ответ" здесь: вы должны сделать шаг назад и уточнить, что именно вы собираетесь делать со своими данными; и затем вы используете этот поток (ы), соответствующий этим требованиям.