2015-08-13 4 views
0

Я пытаюсь преобразовать файлы в строку Base64. Для файла небольшого размера он отлично работает, для файлов размером более 500 МБ он выдает OutOfMemoryError. Я должен преобразовать файл в Base64 encodedString, потому что это требование моей стороны на сервере для загрузки файла через кодировку Base64. можно ли преобразовать и отправить файл 500mb с помощью этого метода? Заранее спасибо.Преобразование байт [] в Base64 String throws OutOfMemoryError

byte[] bytes = null; 
      InputStream inputStream; 
      try { 
       inputStream = new FileInputStream(mFilepath); 
       byte[] buffer = new byte[1024]; 
       int bytesRead; 
       ByteArrayOutputStream output = new ByteArrayOutputStream(); 
       try { 
        while ((bytesRead = inputStream.read(buffer)) != -1) { 
         output.write(buffer, 0, bytesRead); 
        } 
        inputStream.close(); 
        output.flush(); 
        output.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       bytes = output.toByteArray(); 
      } catch (FileNotFoundException e1) { 
       e1.printStackTrace(); 
      } 

      // Here it throws OutOfMemoryError 
      String encodedString = Base64.encodeToString(bytes, Base64.DEFAULT); 

Тогда я передаю encodedString к серверу с помощью HttpURLConnection.

+0

Возможно, это поможет http://stackoverflow.com/questions/9630430/upload-large-file-in-android-without-outofmemory-error – Emil

ответ

0

файлов размером как 500mb он бросает OutOfMemoryError

Конечно. Предел кучи Java-приложения для Android будет намного меньше 500 МБ, не говоря уже о двух копиях данных, один в расширенном (Base64) формате. Есть сотни миллионов устройств, у которых даже не так много ОЗУ для всего устройства, не говоря уже о том, чтобы использовать ваше приложение.

Можно ли преобразовать и отправить файл 500 МБ с помощью этого метода?

Только если вы можете каким-то образом преобразовать преобразованные байты. Преобразуйте несколько байтов, запишите их в сокет, преобразуйте следующую порцию байтов, напишите их в сокет и так далее. У вас нет практического способа преобразования всего 500 МБ файла в Base64 в память и передачи его в виде строки.