我同意Arne的观点,数据处理器不应该知道加密,它只需要读取消息的解密正文并写出结果,流过滤器应该负责加密。但是,由于这在逻辑上是对同一条信息(一条消息)进行操作,因此我认为它们应该封装在一个处理消息格式的类中,尽管加密/解密流确实与此无关。
这是我对结构的想法,稍微翻转架构,并将 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 输出;// 这是发送消息的流 Message inputMessage = new Message(input); 消息 outputMessage = new Message(inputMessage.getEnvelope()); 过程(inputMessage.read(),outputMessage.write(输出));
现在 process 方法只需要从输入中读取需要的数据块,并将结果写入输出:
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.
}
}
现在这一切都在同步进行,您不需要任何额外的线程。您也可以提前中止,而不必处理整个消息(例如,如果输出流已关闭)。