代码之家  ›  专栏  ›  技术社区  ›  fred basset

将字节数组插入列表的最简洁方法?

  •  15
  • fred basset  · 技术社区  · 15 年前

    在某些代码中,我正在创建一个字节列表,并希望在构建列表时向其中插入一个字节数组。最干净的方法是什么?请参见下面的代码-谢谢。

    public class ListInsert {
        public static byte[] getData() {
            return new byte[]{0x01, 0x02, 0x03};
        }
    
        public static void main(String[] args) {
            final List<Byte> list = new ArrayList<Byte>();
            list.add((byte)0xaa);
            list.add(getData()); // I want to insert an array of bytes into the list here
            list.add((byte)0x55);
        }
    }
    
    4 回复  |  直到 8 年前
        1
  •  25
  •   Community CDub    8 年前

    如果您有一个 byte[]arr --一个引用类型的数组--您可以使用 arrays.aslist(arr) to get a list<byte>

    如果您有一个 byte[]arr --一个基元数组--您不能使用 arrays.aslist(arr) to get a list<byte> 。相反,您将得到一个元素 list<byte[]>

    < Buff行情>

    也就是说,当a byte can be boxed to a byte ,a byte[] does not get autoboxed to byte[] !< BR> (也适用于其他原语)

    < /块引用>

    所以你有两个选择:

    第一个选项如下:

    byte[]arr=…;
    对于(字节b:arr){
    清单(b);
    }
    < /代码> 
    
    

    瓜娃的第二个选择如下:

    需要番石榴 字节[]arr=…; list.addall(bytes.aslist(arr)); < /代码>

    这使用bytes.aslist.frompackage com.google.common.primitives。该包还有其他原语的转换实用程序。整个库非常有用。

    对于apache commons lang,您可以使用byte[]toobject(byte[])>fromarrayutils::。

    需要apache commons lang 字节[]arr=…; list.addall(arrays.aslist(arrayUtils.toObject(arr))); < /代码>

    相关问题

    f
    你有一个byte[] arr--基元数组——不能使用数组.aslist(arr)得到一个列表<byte>. 相反,你会得到一个元素List<byte[]>.

    也就是说,当byte可以装箱到ByteAbyte[]自动驾驶室到Byte[]!
    (对于其他原语也是如此)

    所以你有两个选择:

    • 只需迭代每个字节在里面字节[]add个别地
    • 使用库
      • Apache Commons Lang,您可以转换字节[]字节[]
        • 你可以然后Arrays.asListaddAll
      • Guava可以转换字节[]立即地列表<byte>

    第一个选项如下:

    byte[] arr = ...;
    for (byte b : arr) {
        list.add(b);
    }
    

    关岛的第二个选项如下:

    // requires Guava
    byte[] arr = ...;
    list.addAll(Bytes.asList(arr));
    

    这种用途Bytes.asListpackage com.google.common.primitives. 该包还有其他原语的转换实用程序。整个图书馆非常有用。

    使用apache commons lang,您可以使用Byte[] toObject(byte[])ArrayUtils:

    // requires Apache Commons Lang
    byte[] arr = ...;
    list.addAll(Arrays.asList(ArrayUtils.toObject(arr)));
    

    相关问题

        2
  •  4
  •   instcode    15 年前

    这可能无法回答您的问题,但这应该是一个良好的实践。如果您大量操作字节数组,请改用bytebuffer。此类具有多种实现类型,可以为您提供最佳的性能和内存使用率。其中之一是一些操作可以本地运行的直接bytebuffer。

    放置一个字节或一组字节就像吃糖果一样简单:

    ByteBuffer.put(byte src);
    ByteBuffer.put(byte[] src);
    ByteBuffer.put(byte[] src, int offset, int length);
    

    最好的方法是,当您试图取出字节时:直接,不需要数组副本(但您需要检查大小):)

    byte[] data = ByteBuffer.array();
    

    希望你改变主意:)

        3
  •  1
  •   Colin Hebert    15 年前

    >有“http://下载LLNW.Oracle .com /JavaSe/1.4.2/DOCS/API/Java/UTIL/SARD.HTML*aslist(java. Lang.Obj[])”Re= =“NoFoLoLoNeFror”> >代码>

    arrays.aslist(getdata());
    < /代码> 
    
    

    所以在你的情况下:

    list.addall(arrays.aslist(getdata());
    < /代码> 
    具体方法如下:

    Arrays.asList(getData());
    

    所以在你的例子中:

    list.addAll(Arrays.asList(getData()));
    
        4
  •  0
  •   Jarekczek    8 年前

    你真的需要吗 List<Byte> ?我也这么认为,但改变了主意。 ByteArrayOutputStream 对我来说好多了。

    import java.io.ByteArrayOutputStream;
    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    // fill in buf or get a single byte b
    bo.write(buf, 0, bytesRead);
    bo.write(b);
    byte[] resultArray = bo.toByteArray();