Java читает и кодирует большой двоичный файл

1

Столкнувшись с проблемой чтения и кодирования любого файла размером до 100 МБ. У меня есть код, который отлично подходит для небольших файлов txt и кода, которые могут обрабатывать большие объемы данных. Проблема в том, что последний не работает по неизвестной причине. Пробовал общаться с Google без везения и вот почему я здесь.

//Working snippet. Readind putty does nothing.
final String fileName = "C:\\putty.exe";
InputStream inStream = null;
BufferedInputStream bis = null;

try {
    inStream = new FileInputStream(fileName);
    bis = new BufferedInputStream(inStream);

    int numByte = bis.available();
    byte[] buf = new byte[numByte];

    bis.read(buf, 0, numByte);
    buf = Base64.encodeBase64(buf);
    for (byte b : buf) {
        out.write(b);
    }
} catch (Exception e) {
    e.printStackTrace();
} finally { 
    if (inStream != null)
        inStream.close();
    if (bis != null)
        bis.close();
}

Следующий фрагмент был получен из других ответов здесь.

BufferedReader br = null;
long fsize;
int bcap;
StringBuilder sb = new StringBuilder();

FileChannel fc = new FileInputStream(fileName).getChannel();
fsize = fc.size();
ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fsize);
bb.flip();
bcap = bb.capacity();
while (bb.hasRemaining() == true) {
    bcap = bb.remaining();
    byte[] bytes = new byte[bcap];
    bb.get(bytes, 0, bytes.length);
    String str = new String(Base64.encodeBase64(bytes));            
    sb.append(str);
}
fc.close();
((DirectBuffer) bb).cleaner().clean();

String resultString = sb.toString();
out.write(resultString);
out.write("test");

Вот исключение, которое я получил

org.apache.jasper.JasperException: An exception occurred processing JSP page /read.jsp at line 57
54:         while (bb.hasRemaining() == true)
55:             bcap = bb.remaining();
56:             byte[] bytes = new byte[bcap];
57:             bb.get(bytes, 0, bytes.length);
58:             String str = new String(Base64.encodeBase64(bytes));            
59:             sb.append(str);
60:         fc.close();

Любая помощь будет оценена по достоинству.

Теги:
file
base64
jsp
binary

1 ответ

0

Вы не можете продолжать использовать base64 на маленьких кусках, вы не будете знать, как его декодировать позже. Поскольку все сочетания base64 будут создавать одну большую строку base64, у вас не будет никакого способа выяснить, где начинается каждая часть строки base64 или заканчивается. Кроме того, вы не можете предсказать размер строки base64

Вы должны создать строку base64 во всех файлах байтов, не имея другого пути.

Попробуйте заменить

bb.get(bytes, 0, bytes.length);

с

bb.get(bytes, 0, bcap);

или

bb.get(bytes, 0, bb.remaining());

или, может быть

byte[] bytes = new byte[bcap+1];

Я не могу комментировать, у меня нет 50 репутации.

  • 0
    Перепробовал все предложения без удачи. Сначала работает некрасивое и медленное решение, и закодированные байты были правильно декодированы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню