| 著作一覧 |
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の長所か。
ジェズイットを見習え |