@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

BuferedWriterですが。。

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/04/25
投稿数: 7
投稿日時: 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();
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-04-27 07:34
ファイルというか、HTTP接続が正しくクローズされないので、エラーになっているだけでは?
キープアライブしない限り、通常のHTTPはコネクションレスなので、正しくソケットを閉じないと正常にリクエストが終わったことにならないのだと思います。
未記入
会議室デビュー日: 2005/04/25
投稿数: 7
投稿日時: 2005-04-27 10:39
書き忘れていました、申し訳ないです。
コード中の@の下には
conn.disconnect();
を入れてあります。
ちなみにIISを使用していますが、キープアライブは有効に
してあります。
あれからも色々調べましたが、原因が未だつかめておりません。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-04-27 22:41
どうもgetInputStream()がコールされるまで実際のリクエストはサブミットされないみたいですね・・・。いくらStreamに書いてもデータはサーバにまったく到達していないようです。
getResponseCode()はinputStreamが存在しない場合はgetInputStream()で一回取得してから、レスポンスコードを取得しに行っているようです。なので正しく動いています。
disconnect()は単純にソケット接続を切るだけなので、データは送られないようです。
私の環境ではgetResponseCode()の代わりにgetInputStream()を呼んでも同じ結果が得られました。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-04-28 01:42
Anthyhimeさん、こんにちは。

OutputStreamWriterのAPI仕様書を引用すると、
引用:
結果として生成されたバイトは、バッファに蓄積されてから
基本となる出力ストリームに書き込まれます。


とありますから、BufferedWriterだけでなく、OutputStreamWriter
に対しても flush()する必要があるのではないでしょうか?
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2005-04-28 03:39
HTTPというのはrequestを送ってresponseを得るものなので、
HttpUrlConnectionの実装は、responseを参照した時点で初めてrequestを送るように
なっています。
responseに意味がなさそうなPUTメソッドやDELETEメソッドといえども、
getResponseCodeとかgetInputStreamをしないと、
requestが送られないのです。

BufferedWriterのバッファリングのせいではありません。
未記入
会議室デビュー日: 2005/04/25
投稿数: 7
投稿日時: 2005-05-03 13:16
なるほど、だからgetResponseCode();で正常書込みがされていたのですね。
調べが足りなかったようです。
大変お世話になりました。
ありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)