Как я могу хранить байты [] в векторе на Java? - PullRequest
2 голосов
/ 22 июня 2011

Я читаю двоичный файл и сохраняю каждую запись в байт [] . Теперь я хотел бы собрать эти записи в Java Vector . (Так что он может расти бесконечно.) Но Вектор принимает Объекты , а не примитивы (или массивы примитивов, насколько я могу судить).

Есть ли способ "упаковать" массив примитивов, или мне придется переписать мой код, чтобы превратить мои массивы в Массивы и мои байты в Байты ?

Я попытался объединить байты в String , но это не удавалось, из-за склонности String.append () обрабатывать мои байты как целые и конвертировать их в String -я десятичные представления !!

Ответы [ 5 ]

5 голосов
/ 22 июня 2011

byte[] is-an Object (все массивы, даже примитивные).Ничто не мешает вам добавить byte[] к Vector.

Vector<byte[]> records = new Vector<byte[]>();
byte[] firstRecord = readRecord();
records.add(firstRecord);

Хотя это не пахнет хорошим дизайном.Кроме того, вы должны отдавать предпочтение передаче List (интерфейс) вместо Vector (конкретная реализация List).

1 голос
/ 22 июня 2011

Вы можете добавить все байты в байте [] к вектору , просматривая каждый байт.

Однако я бы не советовал вам использовать Vector, поскольку это устаревший класс, который был заменен в Java 1.2 (1998)

Вместо этого вы можете использовать ArrayList, но он будет использовать в 4-16 раз больше памяти, чем исходный байт [].

Если вы не можете использовать TByteArrayList, я предлагаю вам использовать ByteArrayOutputStream и ByteArrayInputStream.

0 голосов
/ 18 марта 2013

Я понимаю, что ты имеешь в виду, Да невозможно поместить массив чего-либо в Vector или даже в ArrayList как один элемент, позвольте мне объяснить, почему следующий код совершенно прав, но мы его неправильно понимаем

Vector<byte[]> records = new Vector<byte[]>();
byte[] firstRecord = readRecord();
records.add(firstRecord);

Третья строка этого кода не помещает массив в вектор, а вместо этого помещает ссылку firstRecord в этот вектор. Затем, если мы изменим содержимое firstRecord после помещения его в вектор, произойдет то, что мы изменим содержимое вектора, потому что у нас есть две ссылки на одну и ту же вещь.

0 голосов
/ 22 июня 2011

Если вы абсолютно не можете преобразовать байты в байты, то вы можете заглянуть в примитивную коллекционную библиотеку, такую ​​как Colt . Он был написан для высокопроизводительных научных материалов, но у него есть примитивные типы коллекций, которые вы можете использовать.

0 голосов
/ 22 июня 2011

Вы можете сделать:

byte[] byteArr = new byte[]{0x41, 0x43};
List<byte[]> listBytes = Arrays.asList(byteArr); // to get a list
List<byte[]> list = new Vector<byte[]>(listBytes); // to instantiate a vector
System.out.println(Arrays.toString(list.get(0)));

Обновление (на основе ваших комментариев)

List<byte[]> l = new Vector<byte[]>(); // to instantiate a vector
l.add(new byte[]{0x51, 0x52});
System.out.println(Arrays.toString(l.get(0)));

OUTPUT

[81, 82]
...