- - PR -
BuferedWriterですが。。
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-04-27 03:04
宜しくお願いします。
Applet上からAppletダウンロード元のサーバー (Appletが置いてあるマシン)にあるサイズ900KBの テキストファイルを読み込み、そのテキストファイルに対し、 BufferedWriterで上書きするAppletを作成していますが、 問題が発生しています。 下記コード一番下の@をコメントにすると、一切書込みが行われなく なってしまいます。 ファイルに書き込むだけなら必ずしも必要なものではないと 思うのですが。。。 その辺りの情報をお持ちの方がいらっしゃいましたら ご教授いただけないでしょうか。 URL url = new URL("http://..."); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("PUT"); conn.setDoOutput(true); conn.connect(); BufferedWriter bw = new BufferedWriter ( new OutputStreamWriter(conn.getOutputStream()), 900000 ); for( int i = 0 ; i < 20014 ; i ++ ) { String s = String.valueOf(i); bw.write(s); if ( i != 20014 - 1 ) bw.newLine(); } bw.flush(); bw.close(); @int code = conn.getResponseCode(); | ||||
|
投稿日時: 2005-04-27 07:34
ファイルというか、HTTP接続が正しくクローズされないので、エラーになっているだけでは?
キープアライブしない限り、通常のHTTPはコネクションレスなので、正しくソケットを閉じないと正常にリクエストが終わったことにならないのだと思います。 | ||||
|
投稿日時: 2005-04-27 10:39
書き忘れていました、申し訳ないです。
コード中の@の下には conn.disconnect(); を入れてあります。 ちなみにIISを使用していますが、キープアライブは有効に してあります。 あれからも色々調べましたが、原因が未だつかめておりません。 | ||||
|
投稿日時: 2005-04-27 22:41
どうもgetInputStream()がコールされるまで実際のリクエストはサブミットされないみたいですね・・・。いくらStreamに書いてもデータはサーバにまったく到達していないようです。
getResponseCode()はinputStreamが存在しない場合はgetInputStream()で一回取得してから、レスポンスコードを取得しに行っているようです。なので正しく動いています。 disconnect()は単純にソケット接続を切るだけなので、データは送られないようです。 私の環境ではgetResponseCode()の代わりにgetInputStream()を呼んでも同じ結果が得られました。 | ||||
|
投稿日時: 2005-04-28 01:42
Anthyhimeさん、こんにちは。
OutputStreamWriterのAPI仕様書を引用すると、
とありますから、BufferedWriterだけでなく、OutputStreamWriter に対しても flush()する必要があるのではないでしょうか? | ||||
|
投稿日時: 2005-04-28 03:39
HTTPというのはrequestを送ってresponseを得るものなので、
HttpUrlConnectionの実装は、responseを参照した時点で初めてrequestを送るように なっています。 responseに意味がなさそうなPUTメソッドやDELETEメソッドといえども、 getResponseCodeとかgetInputStreamをしないと、 requestが送られないのです。 BufferedWriterのバッファリングのせいではありません。 | ||||
|
投稿日時: 2005-05-03 13:16
なるほど、だからgetResponseCode();で正常書込みがされていたのですね。
調べが足りなかったようです。 大変お世話になりました。 ありがとうございました。 |
1