2017-01-19 13 views
1

GoogleドライブのJAVA SDK APIを使用してコードをダウンロードしています。コードはgetGoogleDriveServiceInstance()メソッドがDriveインスタンスを返します。このコードは、小さなファイルには最適ですが、500 MBを超えるファイルについては、メモリ不足エラーが発生しています。この問題を解決するにはいくつかの助けが必要です。エラーがcoming-ある下のファイルサイズは、大きい場合OutOfMemory Java SDK APIを使用してGoogleドライブからファイルをダウンロードする際にエラーが発生しました

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; 
    } 

>

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に精通していませんが、 'executeMediaAndDownloadTo(..)'の呼び出し中にエラーとして@ammuのエラーが発生しないと思います。サイズの制限がある場合や、大容量ファイルの場合は必要に応じてクライアントメモリを設定することができます。あなたの 'baos'は記憶が残っていないという点まで成長し続けます。 APIが少し読んで少し書くオプションを与えない限り、あなたは無力です。 –

答えて

関連する問題