我在android应用程序中使用OKHTTP客户端进行网络连接。
public class InputStreamRequestBody extends RequestBody {
private InputStream inputStream;
private MediaType mediaType;
public static RequestBody create(final MediaType mediaType,
final InputStream inputStream) {
return new InputStreamRequestBody(inputStream, mediaType);
}
private InputStreamRequestBody(InputStream inputStream, MediaType mediaType) {
this.inputStream = inputStream;
this.mediaType = mediaType;
}
@Override
public MediaType contentType() {
return mediaType;
}
@Override
public long contentLength() {
try {
return inputStream.available();
} catch (IOException e) {
return 0;
}
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
Source source = null;
try {
source = Okio.source(inputStream);
sink.writeAll(source);
} finally {
Util.closeQuietly(source);
}
}
}
OkHttpClient client = new OkHttpClient();
request = new Request.Builder().url("URL string here")
.addHeader("X-CSRFToken", csrftoken)
.addHeader("Content-Type", "application/json")
.build();
response = getClient().newCall(request).execute();
InputStream is = response.getEntity().getContent();
接受下面的回答。我修改过的代码:
request = new Request.Builder().url(urlString).build();
response = getClient().newCall(request).execute();
InputStream is = response.body().byteStream();
BufferedInputStream input = new BufferedInputStream(is);
OutputStream output = new FileOutputStream(file);
byte[] data = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
无论如何,我推荐来自okio的response.body().source()
(因为OkHttp已经在本地支持它),以便更容易地操作下载文件时可能出现的大量数据。
@Override
public void onResponse(Call call, Response response) throws IOException {
File downloadedFile = new File(context.getCacheDir(), filename);
BufferedSink sink = Okio.buffer(Okio.sink(downloadedFile));
sink.writeAll(response.body().source());
sink.close();
}
与InputStream相比,文档中有几个优点:
该接口在功能上等效于InputStream。当使用的html" target="_blank">数据异构时,InputStream需要多个层:用于基本值的DataInputStream、用于缓冲的BufferedInputStream,以及用于字符串的InputStreamReader。此类使用BufferedSource实现上述所有功能。源代码避免了不可能实现的available()方法。相反,调用方指定它们需要多少字节。
在实现一个源时,您不必担心单字节读取方法,这种方法难以有效地实现,并且返回257个可能值中的一个。
source有一个更强的skip方法:bufferedsource.skip(long)不会过早返回。
问题内容: 我正在尝试使用以下方法下载此文件(http://github.com/downloads/TheHolyWaffle/ChampionHelper/ChampionHelper-4.jar),但似乎无法正常工作。我收到一个空文件/损坏的文件。 但是我可以使用相同的方法从我的保管箱(http://dl.dropbox.com/u/13226123/ChampionHelper-4.jar
我需要使用okhttp将捆绑在apk中的二进制文件上传到服务器。使用urlconnection,您可以简单地获得资产的inputstream,然后将其放入您的请求中。但是,okhttp只给你上传字节数组,字符串,或者文件的选项。由于您无法获得捆绑在apk中的资产的文件路径,唯一的选择是将文件复制到本地文件目录(我宁愿不这样做),然后将文件交给okhttp?难道没有办法直接使用assetinputs
问题内容: 我在从互联网下载我的应用程序中的二进制文件时遇到问题。在Quicktime中,如果我直接下载它,则可以正常工作,但是通过我的应用程序,它会以某种方式混乱(即使它们在文本编辑器中看起来完全一样)。这是一个例子: 问题答案: 我不知道这是否是唯一的问题,但是你在其中遇到了典型的Java故障:你没有指望总是允许read()返回的字节数少于你要求的字节数。因此,你的读取可能会少于1024个字节
问题内容: 我有存储在MySQL表longblob字段中的Excel电子表格。我需要检索此数据,然后将其作为可下载文件流式传输给用户,最好不要先将其写入磁盘。 可能? 编辑-嗯,刚想出来…在下面的答案中发布。 问题答案:
问题内容: 我正在尝试使用jQuery AJAX下载二进制音频文件。 通常我只会发出这样的命令: 但是,最近我们的服务器等待时间太长,无法响应,并且我收到了令人讨厌的网关超时消息。 有人建议我改用jQuery AJAX,从那时起我就可以更好地控制超时了。 这是到目前为止我玩过的代码: 当我省略“ dataType”时,二进制文件的传输量大约是服务器上实际文件传输量的三倍。但是,当我使dataTyp
OpenJDK的最新长期版本是11.0.4https://wiki.openjdk.java.net/display/JDKUpdates/JDK11u但我找不到类似于OpenJDK站点的官方下载站点https://jdk.java.net/12/ 适用于Windows、Mac和Linux的OpenJDK 11.0.4二进制文件是否可从官方来源下载?