如何使用google-api-java-client在Android上下载大文件?

问题描述:

最近,我尝试使用google-api-java-client库来访问Google文档。我可以使用此库来获取列表,创建新文档并成功更新。但是,当我想从Google文档下载大文件(> 10mb)时,会导致OutOfMemoryError。如何使用google-api-java-client在Android上下载大文件?

03-30 17:57:10.650: E/AndroidRuntime(11022): java.lang.OutOfMemoryError 
03-30 17:57:10.650: E/AndroidRuntime(11022): at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91) 
03-30 17:57:10.650: E/AndroidRuntime(11022): at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201) 
03-30 17:57:10.650: E/AndroidRuntime(11022): at com.google.api.client.http.AbstractInputStreamContent.copy(AbstractInputStreamContent.java:213) 
03-30 17:57:10.650: E/AndroidRuntime(11022): at com.google.api.client.http.AbstractInputStreamContent.copy(AbstractInputStreamContent.java:179) 
03-30 17:57:10.650: E/AndroidRuntime(11022): at com.google.api.client.http.HttpResponse.getContent(HttpResponse.java:384) 

这是我的代码:

try { 
    ... 
    HttpRequest request = getRequestFactory().buildGetRequest(link); 
    HttpResponse response = request.execute(); 
    InputStream is = response.getContent(); 
    ... 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

响应代码是200,它可以在小文件成功运行。 有没有什么方法使用google-api-java-client下载大文件?

+0

我认为,你在你的代码,那里的三个点现在,是相关的部分。如果文件太大,则必须将其传输到文件系统,因为您无法将其保存在内存中。 – koma 2012-03-30 12:12:59

+0

我发现问题是api函数response.getContent(),它使用ByteArrayOutputStream保存文件数据。所以当文件太大时,会导致OutOfMemoryError。 – bukiya 2012-04-03 01:43:59

感谢您报告问题!对我来说看起来像一个bug。在这里提起它:

http://code.google.com/p/google-http-java-client/issues/detail?id=82

作为一个变通办法,请了这个请求禁用日志记录如下:

request.setContentLoggingLimit(0);