Я согласен с Арне , обработчик данных не должен знать о шифровании, ему просто нужно прочитать расшифрованный текст сообщения и записать результаты, а потоковые фильтры должны позаботиться о шифровании , Однако, поскольку он логически работает с одним и тем же фрагментом информации (сообщением), я думаю, они должны быть упакованы в один класс, который обрабатывает формат сообщения, хотя потоки шифрования / дешифрования действительно не зависят от .
Вот моя идея структуры, несколько перевернувшей архитектуру и переместив класс Message за пределы потоков шифрования:
class Message {
InputStream input;
Envelope envelope;
public Message(InputStream input) {
assert input != null;
this.input = input;
}
public Message(Envelope envelope) {
assert envelope != null;
this.envelope = envelope;
}
public Envelope getEnvelope() {
if (envelope == null && input != null) {
// Read envelope from beginning of stream
envelope = new Envelope(input);
}
return envelope
}
public InputStream read() {
assert input != null
// Initialise the decryption stream
return new DecryptingStream(input, getEnvelope().getEncryptionParameters());
}
public OutputStream write(OutputStream output) {
// Write envelope header to output stream
getEnvelope().write(output);
// Initialise the encryption
return new EncryptingStream(output, getEnvelope().getEncryptionParameters());
}
}
Теперь вы можете использовать его, создав новое сообщение для ввода и одно для вывода:
OutputStream output; // Это поток для отправки сообщения
Сообщение inputMessage = новое сообщение (вход);
Сообщение outputMessage = новое сообщение (inputMessage.getEnvelope ());
процесс (inputMessage.read (), outputMessage.write (output));
Теперь метод процесса просто должен прочитать порции данных в соответствии с требованиями ввода и записать результаты в вывод:
public void process(InputStream input, OutputStream output) {
byte[] buffer = new byte[1024];
int read;
while ((read = input.read(buffer) > 0) {
// Process buffer, writing to output as you go.
}
}
Теперь все это работает в режиме реального времени, и вам не нужны никакие дополнительные потоки. Вы также можете прервать работу раньше, не обрабатывая все сообщение (например, если выходной поток закрыт).