- - PR -
ファイルサイズの取得(ByteBuffer)
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-02-05 23:08
nioパイプを使ってデータの送受信をしようとしているんですが、
データの読み込みが出来ないようなんです。 以下は読み書きの部分のソースです。 ---- Pipe pipe; SourceChannel sourceChannel = pipe.source(); sourceChannel.configureBlocking(false); SinkChannel sinkChannel = pipe.sink(); int msg = 1; int str = "1,10,100,1000,10000,100000,1000000"; ByteBuffer b = ByteBuffer.allocate(1024); b.putInt(msg); b.putInt(str.length()); b.put(str.getBytes()); int len = sinkChannel.write(b); System.out.println("write len : " + len); ByteBuffer d = ByteBuffer.allocate(1024); int len2 = sourceChannel.read(d); System.out.println("read len : " + len2); int msg2 = d.getInt(); System.out.println("msg : " + msg2); int size = d.getInt(); System.out.println("size : " + size); byte[] buf = new byte[size]; d.get(buf); str = new String(buf); System.out.println("str : " + str); --- write len : 982 read len : 982 msg : 0 size : 0 str : --- ↑は実行結果です。 どこが間違っているんでしょうか。 よろしくお願いします。 [ メッセージ編集済み 編集者: volvic 編集日時 2007-02-06 15:28 ] | ||||
|
投稿日時: 2007-02-06 10:50
EOFExceptionが出ているところからすれば、
書き出したバイト数と読み込んだバイト数が食い違っているのでしょう。 ソース中のmsgってなんですか? String.getBytes()のエンコードの指定がないですが、 プラットフォームのデフォルトでよいのですか? String.getBytes()の結果のbyte[]の長さと同じ値を ちゃんと先頭に書き出せていますか? ステップ実行しつつ変数の値を確認してみてはいかがでしょうか。 | ||||
|
投稿日時: 2007-02-06 12:13
とりあえず、ここが間違っていますよね? byte[] に += しても後ろにデータは追加されません。 ByteArrayOutputStream あたりを調べてみてください。 | ||||
|
投稿日時: 2007-02-06 12:36
あ。本当だ。気づかなかった。 これ、コンパイルエラーになるはずですよねぇ。 実際のソースはどうなってるんだろう。 | ||||
|
投稿日時: 2007-02-06 12:39
あ〜。
放置して別スレッドに移行したのか…。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36572&forum=12 | ||||
|
投稿日時: 2007-02-06 12:56
別の方法でトライしてました。
放置していてすみません。 >ソース中のmsgってなんですか? 間違って残してました。msg→sizeです。 >byte[] に += しても後ろにデータは追加されません。 +=の部分は実際のソースでは配列の結合をしています。 #+=のところはSystem.arraycopyで実装しています。 | ||||
|
投稿日時: 2007-02-06 15:04
情報が分散するとよくないので、以後、新スレッドに移行してください。
以後、関連ネタは同一スレッドで行うように注意してください。 スレッド名が不適切だと思えば、親切ではなく、修正すればよいのです。 | ||||
|
投稿日時: 2007-02-06 15:21
混乱を招きまして申し訳ありませんでした。
ここのスレッドの内容を修正いたしますので、 よろしくお願いします。 |
1