Подключение InputStream и OutputStream с помощью PipedInputStream / PipedOutputStream

#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 передаются и используются между потоками.