2014-10-28 6 views
1

У меня есть двоичный файл, который содержит большие данные endian. Я использую этот код для чтения вJava ByteBuffer для Zipfile

FileChannel fileInputChannel = new FileInputStream(fileInput).getChannel(); 
ByteBuffer bb = ByteBuffer.allocateDirect((int)fileInputChannel.size()); 
while (bb.remaining() > 0) 
    fileInputChannel.read(bb); 
fileInputChannel.close(); 
bb.flip(); 

Я должен сделать что-то идентичное для zip-файлов. Другими словами, распакуйте файл из zip-файла и закажите его. Я понимаю, что могу прочитать его через ZipInputStream, но потом я должен предоставить кодировку для «endianness». С ByteBuffer вы можете использовать ByteOrder.

Есть ли альтернатива NIO для почтовых файлов?

+1

Данные в zip-файле сжаты, поэтому изменение порядка в байтах бессмысленно. Когда вы пишете в своем вопросе, сначала распакуйте файлы, и поменяйте их на байты, чтобы изменить их имена. –

+0

Вам это не нужно. Используйте 'ZipInputStream', предоставленный в JDK. Вы начинаете с неправильного места, и вам, конечно же, не нужно разбираться с проблемами с endian в ZIP-файле. – EJP

+0

@ EJP- Endian проблемы НЕ находятся в ZIP-файле. Они находятся в несжатом файле. Извините, если текст не передает вопрос достаточно точно. – gansub

ответ

2

Если у вас есть ZipInputStream, просто используйте Channels.newChannel, чтобы преобразовать его в Channel, затем действуйте по вашему желанию. Но вы должны помнить, что возможно, что ZipInputStream не может предсказать свой несжатый размер, поэтому вам, возможно, придется угадать соответствующий размер буфера и, возможно, перераспределить больший буфер при необходимости. И поскольку основной API использует байтовые массивы, нет никакой пользы в использовании directByteBuffer s в случае ZipInputStream, то есть я рекомендую использовать ByteBuffer.allocate вместо ByteBuffer.allocateDirect для этого прецедента.

Кстати, вы можете заменить while(bb.remaining() > 0) на while(bb.hasRemaining()). А так как Java 7 вы можете использовать FileChannel.open, чтобы открыть FileChannel без обхода через FileInputStream.

+0

Из всех людей, которые ответили только, вы поняли мой вопрос! И спасибо за обзор кода! – gansub

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