著作一覧 |
JDK1.5以降で、URLConnectionにsetConnectTimeoutが実装されたので、おれさまHTTPクライアントを作る必要がなくなったと考えた。
たまたま、text/xmlで文字コードがWindows-31Jのデータを読み込む必要があったので、次のような(実際にはもっと複雑)プログラムを作った。
import java.io.*; import java.net.*; public class XmlReader { public static void main(String[] args) throws Exception { URL url = new URL("http://www.artonx.org/data/win31j.xml"); HttpURLConnection c = (HttpURLConnection)url.openConnection(); c.setConnectTimeout(1000); c.setReadTimeout(3000); c.connect(); if (c.getResponseCode() == HttpURLConnection.HTTP_OK) { ByteArrayOutputStream bao = new ByteArrayOutputStream(); byte[] buff = new byte[4000]; int n; InputStream is = c.getInputStream(); while ((n = is.read(buff)) >= 0) { if (n > 0) { bao.write(buff, 0, n); } } is.close(); String s = new String(bao.toByteArray(), "windows-31j"); System.out.println(s); } c.disconnect(); } }
む、期待した通りに動かない。つまりまっとうに動作する。
c:?test>java XmlReader <?xml version="1.0" encoding="windows-31j"?> <data>日本語のデータ</data>
Solaris版だと??になって、結局、サーバでtext/xml; charset=windows-31jを返すようにしたのだが、変だな。そこまでJDKの実装が異なるとは思えないし(何かSolaris版の最初の実装にはバグがあったのかな)、なんでうまく動くんだろう。
という時に、既定の実装がすぐに見えないのは不便だな。というか、こういう時にすぐデカフェできるのが、IDEの長所か。
ジェズイットを見習え |