java为什么需要HTTPURLConnection。getInputStream()需要时间
我有一个任务要下载&;在Android(Java平台)中使用HTTP协议上传文件
我正在使用以下代码上载文件:
HttpURLConnection httpURLConnection = (HttpURLConnection) serverUrl.openConnection();
....
httpURLConnection.connect();
OutputStream os = httpURLConnection.getOutputStream();
并使用以下代码下载文件:
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
...
urlConnection.connect();
DataInputStream stream = new DataInputStream(urlConnection.getInputStream());
根据我的观察,这两种情况下的connect()都需要时间,因为此时它正在与网络通信。对于文件上传,getOutputStream()的执行速度非常快,这是否意味着它没有与网络通信
而getInputStream()(在文件下载中)需要一些时间(大约200到2500毫秒)才能执行。这是否意味着此时它正在与网络通信?如果是,原因为何
专家们,请提供您对此的意见&;如果我哪里做错了,请纠正我
# 1 楼答案
您必须通过指定流模式来限制缓冲,通过
setFixedLengthStreamingMode
方法给出上传信息的最终长度,或者如果通过setChunkedStreamingMode
方法不知道最终长度,则将模式设置为流:如果不这样做,则在调用
getInputStream()
时将发生真正的传输见https://developer.android.com/reference/java/net/HttpURLConnection.html
# 2 楼答案
HTTP是一种请求/响应协议。您需要TCP连接。connect()方法创建了一个连接。然后你需要发送一个请求。为此调用getOutputStream(),然后编写它
此时,还没有向网络写入任何内容(在正常传输模式下),因为必须设置内容长度头,Java不知道何时完成写入。因此,当您调用getInputStream()(或getResponseCode())时,Java设置内容长度头,写入请求,等待服务器开始生成响应,读取所有响应头,然后将输入流定位在响应体的开头。所有这些步骤都需要时间