2016-04-28 13 views
1

バイトバッファに整数と文字列を書き込もうとしています。その後、このバイト配列がハードドライブに書き込まれます。ループの中に最後の文字だけが書かれ​​ている文字列を書く時以外は、すべてうまくいくようです。私はそれをチェックしたので、文字列の解析が正しいように見えます。 これは私がbbuf.putステートメントを使う方法のようです。私は後に、それをフラッシュする必要がある、そしてなぜ.putInt文細かい作業を行い、バイトバッファに文字列を挿入する

//write the PCB from memory to file system 
private static void _tfs_write_pcb() 
{ 

    int c; 
    byte[] bytes = new byte[11]; 


    //to get the bytes from volume name 
    try { 
     bytes = constants.filename.getBytes("UTF-8");   //convert to bytes format to pass to function 
    } catch (UnsupportedEncodingException e) { 

     e.printStackTrace(); 
    }  

    ByteBuffer bbuf = ByteBuffer.allocate(bl_size); 

    bbuf = bbuf.putInt(rt_dir_start); 
    bbuf = bbuf.putInt(first_free_data_bl); 
    bbuf = bbuf.putInt(num_bl_fat); 
    bbuf = bbuf.putInt(bl_size); 
    bbuf = bbuf.putInt(max_rt_entries); 
    bbuf = bbuf.putInt(ft_copies); 


    for (c=0; c < vl_name.length(); c++) { 
     System.out.println((char)bytes[c]); 
     bbuf = bbuf.put(bytes[c]); 
    } 

    _tfs_write_block(1, bbuf.array()); 

} 
+0

2つの質問 - 1)ループの最大値は 'bytes.length'ではなく' vl_name.length'です。これは意図的ですか?もしそうなら、あなたは何を達成しようとしていますか? 2) 'bbuf.put(bytes)'や 'bbuf.put(bytes、offset、length)'だけを使ってみましたか? –

+0

はい、意図的です。彼らは同じサイズなので、問題ではありません。コードをbbuf = bbuf.put(bytes)に変更しました。あなたが示唆したとおりですが、まったく同じことが起こります – Mark

+0

デバッガやデバッグプリントで 'constants.filename'の値を調べましたか? 'blSize'は6つの4バイト整数と文字列を保持するのに十分な大きさですか? –

答えて

1

のByteBufferは、バイトの配列をput'tingための方法を持っているの.putしないでください。一度に1つずつ入れる理由はありますか? put(byte)もabstractであることに注意してください。

だからforループに単純化される:

bbuf = bbuf.put(bytes, 6, bytes.length); 

http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html#put-byte:A-

EDIT: JavadocはPUT(バイト[])は、インデックス0で開始することを指定するので(バイト形式のPUTを使用[]、index、length)を使用します。

public final ByteBuffer put(byte[] src) 

Relative bulk put method (optional operation). 

This method transfers the entire content of the given source byte array 
into this buffer. An invocation of this method of the form dst.put(a) 
behaves in exactly the same way as the invocation 

    dst.put(a, 0, a.length) 

もちろん、Stringバイトを挿入する方法は関係ありません。私は発見実験を示唆しているだけです。

+0

方法 '置く(バイト)が' 'ByteBuffer.allocateによって返されたByteBufferのサブクラス()'で抽象的ではありません。 –

+0

ありがとうございます。私はコードを変更しましたが、それでも動作しません。同じ結果が最後の文字のみを書き込むbbuf = bbuf.put(bytes); – Mark

+0

あなたは正確に何が起こっているかを確認するためにステップデバッガでこのコードを歩いていますか?実際に何が行われているのかを見ることに代わるものはありません。 – guitarpicva

関連する問題