#java #stream #inputstream #outputstream
#java #поток #входной поток #outputstream
Вопрос:
У меня есть два разных сценария, в которых я пытаюсь подключить InputStream с OutputStream, и оба вышеуказанных сценария работают должным образом, когда размер данных в исходном InputStream меньше, чем BUFFER_SIZE
, однако, когда он превышает BUFFER_SIZE
, он зависает и, похоже, ожидает потребления, хотя потребитель конечногоInputStream пытается использовать поток.
Сценарий 1:
PipedInputStream is = new PipedInputStream(BUFFER_SIZE);
PipedOutputStream os = new PipedOutputStream(in);
service.decrypt(originalInputStream, os);
service.encrypt(is, finalOutputStream);
Здесь decrypt()
метод использует originalInputStream
и записывает выходные данные в PipedInputStream
(os), и мне нужно перенаправить выходные данные в следующий метод encrypt()
с первым аргументом и сохранить выходные encrypt()
данные метода finalOutputStream
.
Сценарий 2:
public InputStream download(InputStream downloadableInputStream) {
PipedInputStream is = new PipedInputStream(BUFFER_SIZE);
PipedOutputStream os = new PipedOutputStream(is);
service.encrypt(downloadableInputStream, os);
return is;
}
Здесь download()
метод принимает и возвращает InputStream, где он попытается зашифровать поток с помощью encrypt()
метода, а вызывающий метод будет использовать зашифрованный поток.
Оба encrypt()
decrypt()
метода и внутренне создают новый поток и используют защелку обратного отсчета для ожидания завершения.
Оба encrypt()
decrypt()
метода и используются вне этих сценариев без PipedInputStream / PipedOutputStream, и они работают, как и ожидалось, с очень большими файлами, это только кажется проблемой при использовании PipedInputStream / PipedOutputStream.
Комментарии:
1. Эти конвейерные потоки предназначены для использования между потоками, где один поток читает, а другой записывает. Если у вас нет потока чтения, поток записи будет заблокирован. Ваше использование их здесь недопустимо. Вам нужно просто прочитать ваш ввод и зашифровать его на выходе. Каналы не нужны.
2. Как я уже упоминал, методы encrypt() и decrypt() создают новый поток, поэтому оба PipedInputStream / PipedOutputStream передаются и используются между потоками.