オリジナルのquestion about RSA and Base64 encodingとそのコメントに基づいて、Base64OutputStream(またはInput Stream)を書き込む最良の方法は何か疑問に思っています。私は元々それをBase64PrintWriterと呼び、それをPrintWriterからPrintWriterをコンストラクタに渡して拡張しました。Java、Base64:デコレータパターンを使用してBase64OutputStreamクラスを書き込む方法
import org.bouncycastle.util.encoders.Base64;
public class Base64OutputStream extends FilterOutputStream {
public Base64OutputStream(OutputStream out) {
super(out);
}
public void write(byte[] decodedBytes) throws IOException {
byte[] base64Message = Base64.encode(decodedBytes);
super.write(base64Message);
}
public void writeln(byte[] decodedBytes) throws IOException {
write(decodedBytes);
super.write("\n".getBytes());
super.flush();
}
}
私は上記のいずれかに私の元の実装を変更し、私はそれを初期化します。
Base64OutputStream base64encoder = new Base64OutputStream(socket.getOutputStream());
私の質問は以下のとおりです。
- これは良いデザインますか?
- もっと良いことができますか?
- デコレータパターンを正しく適用しましたか?
- OutputStreamの代わりにFilteredOutputStreamを拡張するのは良いですか? Oracleはそれが良いことを示していますが、まだOutputStreamから拡張するには何らかの欠点や理由がありますか?
- コンストラクタを呼び出すと、BufferedOutputStreamでさらに装飾する必要がありますか?
こんにちはlanoxx、あなたは他の質問のデザインにコメントするように頼まれました。私が言ったように、私は個人的には文字エンコーディングミスをするのが難しくなるため(UTF-16文字を含むストリームに書き込むときなど)Writer を親として(エンコーダ用に)個人的に持っています。それ以外の場合は、Brent Wordensの回答とApacheインターフェイスのコピー(例:改行処理)をお勧めします。それに欠けていることの1つは、適切な例外処理です。それを回避したいかもしれません。必要に応じて、Java 1の状態ベースの実装を貼り付けることができます。5以上。 –