- PR -

ファイルサイズの取得(ByteBuffer)

1
投稿者投稿内容
volvic
会議室デビュー日: 2006/08/20
投稿数: 17
投稿日時: 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 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-06 10:50
EOFExceptionが出ているところからすれば、
書き出したバイト数と読み込んだバイト数が食い違っているのでしょう。

ソース中のmsgってなんですか?
String.getBytes()のエンコードの指定がないですが、
プラットフォームのデフォルトでよいのですか?
String.getBytes()の結果のbyte[]の長さと同じ値を
ちゃんと先頭に書き出せていますか?

ステップ実行しつつ変数の値を確認してみてはいかがでしょうか。
きよの
常連さん
会議室デビュー日: 2004/02/07
投稿数: 34
投稿日時: 2007-02-06 12:13
引用:

volvicさんの書き込み (2007-02-05 23:08) より:
// bの後ろに転送文字列を結合
b += "hogehogehoge".getBytes();
お願いします。



とりあえず、ここが間違っていますよね?
byte[] に += しても後ろにデータは追加されません。
ByteArrayOutputStream あたりを調べてみてください。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-06 12:36
引用:

きよのさんの書き込み (2007-02-06 12:13) より:
とりあえず、ここが間違っていますよね?
byte[] に += しても後ろにデータは追加されません。



あ。本当だ。気づかなかった。
これ、コンパイルエラーになるはずですよねぇ。
実際のソースはどうなってるんだろう。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-06 12:39
あ〜。
放置して別スレッドに移行したのか…。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36572&forum=12
volvic
会議室デビュー日: 2006/08/20
投稿数: 17
投稿日時: 2007-02-06 12:56
別の方法でトライしてました。
放置していてすみません。

>ソース中のmsgってなんですか?
間違って残してました。msg→sizeです。

>byte[] に += しても後ろにデータは追加されません。
+=の部分は実際のソースでは配列の結合をしています。
#+=のところはSystem.arraycopyで実装しています。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-06 15:04
情報が分散するとよくないので、以後、新スレッドに移行してください。
以後、関連ネタは同一スレッドで行うように注意してください。
スレッド名が不適切だと思えば、親切ではなく、修正すればよいのです。
volvic
会議室デビュー日: 2006/08/20
投稿数: 17
投稿日時: 2007-02-06 15:21
混乱を招きまして申し訳ありませんでした。
ここのスレッドの内容を修正いたしますので、
よろしくお願いします。
1

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