2011-01-15 10 views
0

Я ищу что-то простое (без внешней библиотеки), чтобы писать и загружать байт [] из файла. Более-менее что-то вроде [Python's pickle] [1].Запись и чтение байт [] из файла

byte[] bytes = new byte[10]; 
ByteBuffer bbuf = new ByteBuffer.allocate(bytes.length); 
bbuf.wrap(bytes); // edited due to Jon Skeet's answer 
CharBuffer cbuf = bbuf.asCharBuffer(); 
cbuf.put("t"); 
FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

Проблема заключается в том, что я не могу прочитать структуру объекта из такого файла. В hex-редакторе, кроме того, файл «somebytes» содержит только пару или 0s. Таким образом, не кажется, что FileOutputStream помещает в него любой контент («t» или байт-эквивалент).

[1] http://wiki.python.org/moin/UsingPickle

ответ

4

Вы выделили байтовый буфер с размером из bytes, но это не означает, что буфер байт связан с массивом байтов. Вы можете обернуть массив байтов, используя ByteBuffer.wrap.

Вот минимальные изменения в код, который делает написать t в файл:

byte[] bytes = new byte[10]; 
ByteBuffer bbuf = ByteBuffer.wrap(bytes); 
CharBuffer cbuf = bbuf.asCharBuffer(); 
cbuf.put("t"); 
FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

Заметим, что для реального кода, вы должны использовать попытаться /, наконец, блок, чтобы убедиться, что файл всегда закрыт независимо от исключений.

Однако это далеко от сериализации. Java делает имеет свою собственную двоичную сериализацию - см. ObjectOutputStream и ObjectInputStream. Лично я обычно избегаю такого рода сериализации, поскольку он может быть очень хрупким перед лицом изменений в классах. Существуют различные другие подходы к сериализации, такие как использование Thrift или протокольных буферов для двоичной сериализации или сериализация в XML, JSON или какой-либо другой формат, читаемый человеком.

+0

У файла будет один байт для 't', за которым следует 9 нулевых '\ 0' байтов. Не уверен, что это было предназначено. –

+0

@Peter: Я только пытался получить исходный код для записи * некоторых данных * на диск. Учитывая, что конечная цель заключалась в более полной сериализации, я обсуждал это в последней части ответа. –

0

Вы можете

seek(position) 
b = read(length) 

Тогда б будет массив байтов вашей длины.

Извините, перечитывая, вы ищете письмо, а не чтение.

-1

Простая версия этого же предмета есть.

byte[] bytes = new byte[10]; 
bytes[1] = 't'; 

FileOutputStream test = new FileOutputStream("somebytes"); 
test.write(bytes); 
test.close(); 

Существует множество примеров того, как читать/писать байт [] из файлов в Интернете. попробуйте google.

+2

Хотя это компилируется, это всего лишь несколько случайно, потому что вы используете константу char, которая, как оказалось, находится в диапазоне байтов - пытается хранить * символы * в массиве байтов прямо так (вместо использования каких-либо конкретных кодирование или даже буфера символов, обертывающее байтовый массив) - действительно плохая идея. –

 Смежные вопросы

  • Нет связанных вопросов^_^