2017-01-19 11 views
1

Я использую Google JAVA SDK API для загрузки файлов ниже - это код, метод getGoogleDriveServiceInstance() возвращает экземпляр Drive в приведенном ниже коде. Этот код отлично подходит для небольших файлов, но для файлов> 500 МБ я получаю ошибку «Из памяти», мне нужна помощь в устранении этой проблемы.Ошибка OutOfMemory при загрузке файла с Google Диска с использованием Java SDK API

public boolean downloadFile(String fileId, java.io.File path) { 
     FileOutputStream fos=null; 
     try{ 
      fos = new FileOutputStream(path); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      getGoogleDriveServiceInstance().files().get(fileId).executeMediaAndDownloadTo(baos); 
      baos.writeTo(fos); 
     } catch(Exception ex) { 
      ex.printStackTrace(); 
      return false; 
     } finally { 
      try{fos.close();fos=null;} catch(Exception ex){} 
     } 
     return true; 
    } 

Если размер файла большой, ниже ошибка coming->

Exception in thread "Thread-22" java.lang.OutOfMemoryError: Java heap space 
     at java.util.Arrays.copyOf(Arrays.java:2271) 
     at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) 
     at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) 
     at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140) 
     at com.google.api.client.util.ByteStreams.copy(ByteStreams.java:55) 
     at com.google.api.client.util.IOUtils.copy(IOUtils.java:94) 
     at com.google.api.client.util.IOUtils.copy(IOUtils.java:63) 
     at com.google.api.client.googleapis.media.MediaHttpDownloader.executeCurrentRequest(MediaHttpDownloader.java:247) 
     at com.google.api.client.googleapis.media.MediaHttpDownloader.download(MediaHttpDownloader.java:199) 
     at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeMediaAndDownloadTo(AbstractGoogleClientRequest.java:562) 
     at com.google.api.services.drive.Drive$Files$Get.executeMediaAndDownloadTo(Drive.java:3560) 
+1

Подсказка: вы когда-нибудь задумывались об этом ... Зачем нам нужны потоки? Почему не весь файл как простой объект? – Mordechai

+0

С потоками вы можете немного почитать, сэкономить на локальном диске и повторить. – Mordechai

+1

Я не знаком с API, но я думаю, его ошибка не @ammu, поскольку ошибка возникает при вызове 'executeMediaAndDownloadTo (..)'. Там могут быть ограничения по размеру, или вы можете попробовать установить свою клиентскую память по мере необходимости для больших файлов. Ваш 'baos' продолжает расти, пока не останется больше памяти. Если API не дает некоторых вариантов немного читать и писать немного, я думаю, вы беспомощны. –

ответ