2017-04-07 13 views
2

私は長い間バイトバッファで作業していましたが、ほとんどスライスを使用しませんでした。しかし今ではslice()の大きな問題がbytebufferにあります。Javaバイトバッファスライスはドキュメントごとに動作しません

コード下記参照してください:上記の結果に値:

import java.io.UnsupportedEncodingException; 
import java.nio.ByteBuffer; 
import java.util.Arrays; 

public class Test12 { 

    public static void main(String[] args) throws UnsupportedEncodingException { 

     ByteBuffer original = ByteBuffer.wrap("234567".getBytes("UTF-8")); 
     printBuffer("org: ",original); 

     original.position(1); 
     original.limit(original.limit()-2); 

     printBuffer("org: ",original); 


     ByteBuffer sliced = original.slice(); 
     printBuffer("slc: ",sliced); 

     ByteBuffer duplicated = original.duplicate(); 
     printBuffer("dup: ",duplicated); 

     ByteBuffer compact = original.compact(); 
     printBuffer("cmp: ",compact); 
    } 


    private static void printBuffer(String prefix,ByteBuffer buff) 
    { 
     System.out.println(prefix+buff); 
     System.out.println(prefix+Arrays.toString(Arrays.copyOfRange(buff.array(), buff.position(), buff.limit()))); 

    } 

} 

それはSLCをご覧ください

org: java.nio.HeapByteBuffer[pos=0 lim=6 cap=6] 
org: [50, 51, 52, 53, 54, 55] 
org: java.nio.HeapByteBuffer[pos=1 lim=4 cap=6] 
org: [51, 52, 53] 
slc: java.nio.HeapByteBuffer[pos=0 lim=3 cap=3] 
slc: [50, 51, 52] 
dup: java.nio.HeapByteBuffer[pos=1 lim=4 cap=6] 
dup: [51, 52, 53] 
cmp: java.nio.HeapByteBuffer[pos=3 lim=6 cap=6] 
cmp: [53, 54, 55] 

になります。私は[51, 52, 53]のようなものを期待しています。

私が間違っている場合は修正してください。 これはJavaのバグですか?私は、Java 7でこれを試験

slice方法referenceから8

答えて

2

新しいバッファの位置はゼロは、その能力とその限界が残っているバイトの数であろうとなりこのバッファでは、そのマークは未定義となります。

あなたはそれが答えをm.antkowiczに追加するため、ドキュメント

+0

、どのように「新しいバッファの内容は、このバッファの現在位置から開始しますか」? – Derlin

2

に正常に動作します1に位置を設定するもののので、位置が実際0ですが、スライスのoffset性質のおかげで(つまり

sliced.get(0); 

をあなたに51を与える:あなたが使用して、)buff.arrayOffset()を使用してアクセスすることができます。これを可視化する印刷するには、これにあなたのprintBuffer方法を変更します。

private static void printBuffer(String prefix, ByteBuffer buff) { 
    System.out.println(prefix + buff); 
    System.out.print(prefix); 
    for (int i = buff.position(); i < buff.limit(); i++) { 
     System.out.print(" " + buff.get(i)); 
    } 
    System.out.println(); 
} 

はそれを印刷します:

int offset = buff.arrayOffset(); 
Arrays.copyOfRange(buff.array(), buff.position() + offset, buff.limit() + offset) 

org: java.nio.HeapByteBuffer[pos=0 lim=6 cap=6] 
org: 50 51 52 53 54 55 
org: java.nio.HeapByteBuffer[pos=1 lim=4 cap=6] 
org: 51 52 53 
slc: java.nio.HeapByteBuffer[pos=0 lim=3 cap=3] 
slc: 51 52 53 
dup: java.nio.HeapByteBuffer[pos=1 lim=4 cap=6] 
dup: 51 52 53 
cmp: java.nio.HeapByteBuffer[pos=3 lim=6 cap=6] 
cmp: 53 54 55 

Arrays.asListを使用して維持するために、offsetの両方positionlimitプロパティを追加

フードの下ではsliceが元のバッファ。 offsetプロパティのみが変更されるため、異なる位置を使用してバッファの一部にアクセスできます。

+0

ありがとうエヴォン。今理解しました。 – Slok

0

printBufferメソッドが間違っています。sliceは、内部でバイト配列にアクセスするためのオフセットを内部に保持します。出力するには

基本となるバイト配列、また、これを使用する必要がprintBuffer方法から正しい値がオフセット:程度

private static void printBuffer(String prefix,ByteBuffer buff) 
{ 
    System.out.println(prefix+buff); 
    System.out.println(prefix+Arrays.toString(Arrays.copyOfRange(buff.array(), buff.position()+buff.arrayOffset(), buff.limit()+buff.arrayOffset()))); 

} 
関連する問題