【发布时间】:2018-12-22 02:04:42
【问题描述】:
我在从 Internet (20+GB) 下载大型 json 文件时遇到问题,特别是如何将其保存到本地磁盘。我不想解析json,直接下载就好了。
在 SO 中回答了几个类似的问题,但我没有看到人们对输出有问题 - 我不确定我错过了什么。
无论如何,当我执行以下代码时,它会下载 json 并将相应的字节数组放入文件中,而不是以字符串格式保存。
OkHttpClient httpClient = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.MINUTES)
.readTimeout(CONNECT_TIMEOUT, TimeUnit.MINUTES)
.writeTimeout(CONNECT_TIMEOUT, TimeUnit.MINUTES)
.build();
Request request = new Request.Builder()
.url(path)
.header("User-Agent", ClientConstants.USER_AGENT)
.addHeader("Accept-Encoding", "gzip, deflate, sdch, br")
.addHeader("Content-Type", "application/json")
.build();
Response response = httpClient.newCall(request).execute();
if (!response.isSuccessful()) {
log.error("failed download for url : {0}, with status code {1}", url, response.code());
if (response.body() != null) {
response.body().close();
}
throw new IOException("failed download for url=" + url);
}
else {
try(BufferedInputStream inputStream = new BufferedInputStream(response.body().byteStream())){
byte[] readBuffer = new byte[10000];
FileOutputStream outputStream = new FileOutputStream(this.downloadFilePath);
int bytesRead;
while ((bytesRead = inputStream.read(readBuffer, 0, 10000)) != -1) {
outputStream.write(readBuffer, 0, bytesRead);
outputStream.flush();
}
outputStream.close();
} catch (IOException e) {
log.error("failed download for url=" + url, e);
throw e;
}
}
【问题讨论】:
-
那么问题出在哪里?下载后无法读取/解析 json 文件?我认为这是因为以下标头
Accept-Encoding", "gzip, deflate, sdch, br"您已压缩此文件。因此,如果您将输入流包装到 GZIPInputStream 中,它应该会自动解压缩它。但先用一些较小的测试文件检查一下。 -
是的,做到了。当我需要该标题时,我实际上是在使用不同的提要来下载 zip。但是当我下载一个json时忘了把它拿出来。感谢收看!
标签: java json okhttp3 fileoutputstream bufferedinputstream