Byte array of unknown length in java

前端 未结 4 1119
执笔经年
执笔经年 2020-12-23 19:13

I am constructing an array of bytes in java and I don\'t know how long the array will be.

I want some tool like Java\'s StringBuffer that you can just call .append

4条回答
  •  旧巷少年郎
    2020-12-23 19:16

    Let's see. There is the ByteBuffer class in Java.

    http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html

    It has bulk methods that transfer contiguous sequences of bytes from a byte array to hardware buffers. It would do the trick.

    It also has absolute and relative get and put methods that read and write byte[]s and other primitives to / for the byte buffer.

    It also has methods for compacting, duplicating, and slicing a byte buffer.

    // Creates an empty ByteBuffer with a 1024 byte capacity
    ByteBuffer buf = ByteBuffer.allocate(1024);
    
    // Get the buffer's capacity
    int capacity = buf.capacity(); // 10
    
    buf.put((byte)0xAA); // position=0
    
    // Set the position
    buf.position(500);
    
    buf.put((byte)0xFF);
    
    // Read the position 501
    int pos = buf.position(); 
    
    // Get remaining byte count
    int remaining = buf.remaining(); (capacity - position)
    

    It also has a bulk put to put an array, which is pretty close to the append you were asking for:

    public final ByteBuffer put(byte[] src)
    

    See: http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#put(byte[])

    I wrote my own little lib for manipulating byte arrays. :)

    You can add them like so

    byte [] a = ...
    byte [] b = ...
    byte [] c = ...
    
    a = add(a, b);
    a = add(a, c);
    

    this would give you all of the contents of b, and c after the contents for a.

    If you wanted to grow a by 21, you could do the following:

    a = grow( letters,  21);
    

    If you wanted to double the size of a, you could do the following:

    a = grow( letters,  21);
    

    See...

    https://github.com/RichardHightower/boon/blob/master/src/main/java/org/boon/core/primitive/Byt.java

        byte[] letters =
                arrayOfByte(500);
    
        assertEquals(
                500,
                len(letters)
        );
    

    Create

        byte[] letters =
                array((byte)0, (byte)1, (byte)2, (byte)3);
    
        assertEquals(
                4,
                len(letters)
        );
    

    Index

        byte[] letters =
                array((byte)'a', (byte)'b', (byte)'c', (byte)'d');
    
        assertEquals(
                'a',
                idx(letters, 0)
        );
    
    
        assertEquals(
                'd',
                idx(letters, -1)
        );
    
    
        assertEquals(
                'd',
                idx(letters, letters.length - 1)
        );
    
    
        idx(letters, 1, (byte)'z');
    
        assertEquals(
                (byte)'z',
                idx(letters, 1)
        );
    

    Contains

        byte[] letters =
                array((byte)'a',(byte) 'b', (byte)'c', (byte)'d');
    
    
        assertTrue(
                in((byte)'a', letters)
        );
    
        assertFalse(
                in((byte)'z', letters)
        );
    

    Slice:

        byte[] letters =
                array((byte)'a', (byte)'b', (byte)'c', (byte)'d');
    
    
        assertArrayEquals(
                array((byte)'a', (byte)'b'),
                slc(letters, 0, 2)
        );
    
        assertArrayEquals(
                array((byte)'b', (byte)'c'),
                slc(letters, 1, -1)
        );
    
        //>>> letters[2:]
        //['c', 'd']
        //>>> letters[-2:]
        //['c', 'd']
    
        assertArrayEquals(
                array((byte)'c', (byte)'d'),
                slc(letters, -2)
        );
    
    
        assertArrayEquals(
                array((byte)'c', (byte)'d'),
                slc(letters, 2)
        );
    
    
        //>>> letters[:-2]
        //     ['a', 'b']
        assertArrayEquals(
                array((byte)'a', (byte)'b'),
                slcEnd(letters, -2)
        );
    
    
        //>>> letters[:-2]
        //     ['a', 'b']
        assertArrayEquals(
                array((byte)'a',(byte) 'b'),
                slcEnd(letters, 2)
        );
    

    Grow

        byte[] letters =
                array((byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e');
    
        letters = grow( letters,  21);
    
    
        assertEquals(
                'e',
                idx(letters, 4)
        );
    
    
        assertEquals(
                'a',
                idx(letters, 0)
        );
    
    
    
    
        assertEquals(
                len(letters),
                26
        );
    
    
        assertEquals(
                '\0',
                idx(letters, 20)
        );
    

    Shrink:

        letters =  shrink ( letters, 23 );
    
        assertArrayEquals(
                array((byte)'a', (byte)'b', (byte)'c'),
                letters
    
        );
    

    Copy:

        assertArrayEquals(
                array((byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e'),
                copy(array((byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e'))
    
        );
    

    Add:

        assertArrayEquals(
                array((byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f'),
                add(array((byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e'), (byte)'f') );
    

    The add actually adds them together by using System.arraycopy (considering Unsafe, but not yet).

    Add one array to another:

        assertArrayEquals(
                array(     (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f'),
                add( array((byte)'a', (byte)'b', (byte)'c', (byte)'d'), array((byte)'e', (byte)'f') )
    
        );
    

    Insert:

        assertArrayEquals(
                array((byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g'),
                insert( array((byte)'a', (byte)'b', (byte)'d', (byte)'e', (byte)'f', (byte)'g'), 2, (byte)'c' )
    
        );
    
        assertArrayEquals(
                array((byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g'),
                insert( array((byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g'), 0, (byte)'a' )
    
        );
    
        assertArrayEquals(
                array((byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g'),
                insert( array((byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'g'), 5, (byte)'f' )
    
        );
    

    Here is a peek at a few of the methods:

    public static byte[] grow(byte [] array, final int size) {
        Objects.requireNonNull(array);
    
        byte [] newArray  = new byte[array.length + size];
        System.arraycopy(array, 0, newArray, 0, array.length);
        return newArray;
    }
    
    
    
    public static byte[] grow(byte [] array) {
        Objects.requireNonNull(array);
    
        byte [] newArray  = new byte[array.length *2];
        System.arraycopy(array, 0, newArray, 0, array.length);
        return newArray;
    }
    
    
    public static byte[] shrink(byte[] array, int size) {
        Objects.requireNonNull(array);
    
        byte[] newArray = new byte[array.length - size];
    
        System.arraycopy(array, 0, newArray, 0, array.length-size);
        return newArray;
    }
    
    
    
    
    public static byte[] copy(byte[] array) {
        Objects.requireNonNull(array);
        byte[] newArray = new byte[array.length];
        System.arraycopy(array, 0, newArray, 0, array.length);
        return newArray;
    }
    
    
    public static byte[] add(byte[] array, byte v) {
        Objects.requireNonNull(array);
        byte[] newArray = new byte[array.length + 1];
        System.arraycopy(array, 0, newArray, 0, array.length);
        newArray[array.length] = v;
        return newArray;
    }
    
    public static byte[] add(byte[] array, byte[] array2) {
        Objects.requireNonNull(array);
        byte[] newArray = new byte[array.length + array2.length];
        System.arraycopy(array, 0, newArray, 0, array.length);
        System.arraycopy(array2, 0, newArray, array.length, array2.length);
        return newArray;
    }
    
    
    
    public static byte[] insert(final byte[] array, final int idx, final byte v) {
        Objects.requireNonNull(array);
    
        if (idx >= array.length) {
            return add(array, v);
        }
    
        final int index = calculateIndex(array, idx);
    
        //Object newArray = Array.newInstance(array.getClass().getComponentType(), array.length+1);
        byte [] newArray = new byte[array.length+1];
    
        if (index != 0) {
            /* Copy up to the location in the array before the index. */
            /*                 src     sbegin  dst       dbegin   length of copy */
            System.arraycopy( array,   0,      newArray, 0,       index );
        }
    
    
        boolean lastIndex = index == array.length -1;
        int remainingIndex = array.length - index;
    
        if (lastIndex ) {
            /* Copy the area after the insert. Make sure we don't write over the end. */
            /*                 src  sbegin   dst       dbegin     length of copy */
            System.arraycopy(array, index,   newArray, index + 1, remainingIndex );
    
        } else {
            /* Copy the area after the insert.  */
            /*                 src  sbegin   dst       dbegin     length of copy */
            System.arraycopy(array, index,   newArray, index + 1, remainingIndex );
    
        }
    
        newArray[index] = v;
        return  newArray;
    }
    
    
    public static byte[] insert(final byte[] array, final int fromIndex, final byte[] values) {
        Objects.requireNonNull(array);
    
        if (fromIndex >= array.length) {
            return add(array, values);
        }
    
        final int index = calculateIndex(array, fromIndex);
    
        //Object newArray = Array.newInstance(array.getClass().getComponentType(), array.length+1);
        byte [] newArray = new byte[array.length +  values.length];
    
        if (index != 0) {
            /* Copy up to the location in the array before the index. */
            /*                 src     sbegin  dst       dbegin   length of copy */
            System.arraycopy( array,   0,      newArray, 0,       index );
        }
    
    
        boolean lastIndex = index == array.length -1;
    
        int toIndex = index + values.length;
        int remainingIndex = newArray.length - toIndex;
    
        if (lastIndex ) {
            /* Copy the area after the insert. Make sure we don't write over the end. */
            /*                 src  sbegin   dst       dbegin     length of copy */
            System.arraycopy(array, index,   newArray, index + values.length, remainingIndex );
    
        } else {
            /* Copy the area after the insert.  */
            /*                 src  sbegin   dst       dbegin     length of copy */
            System.arraycopy(array, index,   newArray, index + values.length, remainingIndex );
    
        }
    
        for (int i = index, j=0; i < toIndex; i++, j++) {
            newArray[ i ] = values[ j ];
        }
        return  newArray;
    }
    

    More....

提交回复
热议问题