>すごく基本的な質問かもしれないですが、たとえば「メモリ上にだけ持っていて
>ディスクに書き出していないデータがあるかもしれないのでflush」という
>イメージは分かるのですが、このサンプルの場合はメモリ上のデータの
>やり取りだけなので、flushを何のために行っているのか分かりませんでした。
このサンプルの場合はメモリ上のデータのやり取りだけですが、
それは、Henacatが手抜きのためにレスポンスボディをいったんすべて
メモリに乗せているからであり、これでは、巨大なレスポンスを返す際には
メモリが無駄になります。場合によっては、レスポンスデータを作りながら
どんどんクライアントに返してしまいたいケースもあるでしょう。
その場合、クライアントへのデータの返却を始めてしまったら、
もうレスポンスヘッダの変更はできませんから、途中でエラーが起きても
ステータスとして500とかを返すことはできず、200 OKを返すことになって
しまいますが、それでもいいからクライアントへのデータ返却を始めてしまいたい、
というニーズはあり得ます。それに対応するために、サーブレットAPIでは
「コミット」という概念を導入しています(p.119)。
http://mergedoc.osdn.jp/tomcat-servletapi-5-ja/javax/servlet/ServletResponse.html#getWriter()
その場合、HttpServletResponseのgetWriter()で得られるPrintWriterは、
バッファリングする方がよいでしょう。相手はネットワークだからです。
このように、このPrintWriterはバッファリングする(ようになる)可能性もあるため、
ここではflush()しています。
いずれにしても、バッファリングするしないはPrintWriterの実装詳細に
属することでしょうから、flush()する方が堅実なコーディングではないかと
思います。