2015-08-14 2 views
4

Я хочу разбить файл на несколько кусков (в данном случае, попробуйте длины 300) и base64 закодировать его, так как загрузка всего файла в память дает отрицательное исключение массива при кодировании base64. Я попытался, используя следующий код:Base64 encode file chunks

int offset = 0; 
bis = new BufferedInputStream(new FileInputStream(f)); 
while(offset + 300 <= f.length()){ 
    byte[] temp = new byte[300]; 
    bis.skip(offset); 
    bis.read(temp, 0, 300); 
    offset += 300; 
    System.out.println(Base64.encode(temp)); 
} 
if(offset < f.length()){ 
    byte[] temp = new byte[(int) f.length() - offset]; 
    bis.skip(offset); 
    bis.read(temp, 0, temp.length); 
    System.out.println(Base64.encode(temp)); 
} 

Сначала, кажется, работает, однако, в какой-то момент он переключается только распечатав «AAAAAAAAA» и заполняет всю консоль с ним, и новый файл поврежден при декодировании. Что может вызвать эту ошибку?

+0

ваше смещение не установлено правильно INT кол = bis.read (температура, 0, 300); offset + = count; – PWC

ответ

1

skip() «Пропускает и удаляет n байтов данных из входного потока», а read() возвращает «количество прочитанных байтов».

Итак, вы прочитали несколько байтов, пропустите некоторые байты, прочитайте еще несколько, пропустите, ... в конечном итоге достигнете EOF, в котором точка read() возвращает -1, но вы игнорируете это и используете содержимое temp, которое содержит все 0 , которые затем кодируются для всех A.

Ваш код должен быть:

try (InputStream in = new BufferedInputStream(new FileInputStream(f))) { 
    int len; 
    byte[] temp = new byte[300]; 
    while ((len = in.read(temp)) > 0) 
     System.out.println(Base64.encode(temp, 0, len)); 
} 

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

Если Base64.encode не имеет версию 3 параметра, выполните следующие действия:

try (InputStream in = new BufferedInputStream(new FileInputStream(f))) { 
    int len; 
    byte[] temp = new byte[300]; 
    while ((len = in.read(temp)) > 0) { 
     byte[] data; 
     if (len == temp.length) 
      data = temp; 
     else { 
      data = new byte[len]; 
      System.arraycopy(temp, 0, data, 0, len); 
     } 
     System.out.println(Base64.encode(data)); 
    } 
} 
+0

Отлично, это сработало, спасибо! –