我正在使用HttpURLConnection
或HttpsURLConnection
下载内容。我的问题是为什么HttpURLConnection
和HttpsURLConnection?
这是一个片段:
if (downloadurl.startsWith("https://")) {
HttpsConn = (HttpsURLConnection) url.openConnection();
HttpsURLConnection.setDefaultHostnameVerifier(new AllowAllHostNameVerifier());
SSLContext sc;
sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[] {
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
}
}, null);
HttpsConn.setSSLSocketFactory(sc.getSocketFactory());
HttpsConn.setSSLSocketFactory(sc.getSocketFactory());
HttpsConn.setConnectTimeout(CONNECT_TIME_SECONDS * 1000);
HttpsConn.setReadTimeout(READ_TIME_SECONDS * 1000);
HttpsConn.setChunkedStreamingMode(0);
HttpsConn.connect();
} else {
URLConn = (HttpURLConnection) url.openConnection();
URLConn.setConnectTimeout(CONNECT_TIME_SECONDS * 1000);
URLConn.setReadTimeout(READ_TIME_SECONDS * 1000);
URLConn.setChunkedStreamingMode(0);
URLConn.connect();
}
.
.
.
byte data[] = new byte[1048576];
double currentDownloadSize = 0.0;
long startTime = System.currentTimeMillis();
lastUpdateTime = startTime;
int count;
while ((count = input.read(data)) != -1) {
currentDownloadSize += count;
output.write(data, 0, count);
Thread.sleep(10);
if (isCancelled()) {
output.flush();
output.close();
input.close();
}
}
output.flush();
output.close();
input.close();
当我使用HttpURLConnection
下载文件时,下载速度正常,但是当我使用HttpsURLConnection时,下载速度非常慢。我认为关键点是inputStream!由于InputStream
的缓冲区大小取决于我使用HttpURLConnection
时分配的字节大小,因此下载速度更快,因为它将缓冲区数据写入文件所花费的时间更少。但是当我使用HttpsURLConnection
时,每个循环总是只有8000字节,下载速度有点可怕。
有人有想法吗?
答案 0 :(得分:0)
首先摆脱sleep()
。这只是浪费时间。它所做的就是放大较小读取的效果,你肯定会使用HTTPS,因为TLS块大小限制大约为16k。 flush()
之前的close()
也是多余的,并且您在取消时无法正确地突破您的循环。将你的循环改为:
while ((count = input.read(data)) != -1) {
currentDownloadSize += count;
output.write(data, 0, count);
if (isCancelled()) {
break;
}
}
output.close();
input.close();
...如果可能的话,不要在循环中做任何其他事情。
设置分块流模式只会影响您将请求写入连接的方式。由于你没有写任何东西,这也没有意义。
我不知道你的意思是什么?InputStream
的缓冲区大小...取决于我使用HttpURLConnection时指定的字节大小'。它没有。 InputStream
中没有缓冲区,除非它是BufferedInputStream
,并且您没有指定'任何'字节大小'完全相同,除非你的意思是byte []
缓冲区,它在任何意义上都不属于InputStream
。
你的头衔与你的问题主体不一致。