有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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毫秒)才能执行。这是否意味着此时它正在与网络通信?如果是,原因为何

专家们,请提供您对此的意见&;如果我哪里做错了,请纠正我


共 (2) 个答案

  1. # 1 楼答案

    您必须通过指定流模式来限制缓冲,通过setFixedLengthStreamingMode方法给出上传信息的最终长度,或者如果通过setChunkedStreamingMode方法不知道最终长度,则将模式设置为流:

        // For best performance, you should call either setFixedLengthStreamingMode(int) when the body length is known in advance,
        // or setChunkedStreamingMode(int) when it is not. Otherwise HttpURLConnection will be forced to buffer the complete request body in memory
        // before it is transmitted, wasting (and possibly exhausting) heap and increasing latency.
        //
        // see: https://developer.android.com/reference/java/net/HttpURLConnection.html
    
        _connection.setChunkedStreamingMode(1024);
    

    如果不这样做,则在调用getInputStream()时将发生真正的传输

    https://developer.android.com/reference/java/net/HttpURLConnection.html

  2. # 2 楼答案

    HTTP是一种请求/响应协议。您需要TCP连接。connect()方法创建了一个连接。然后你需要发送一个请求。为此调用getOutputStream(),然后编写它

    此时,还没有向网络写入任何内容(在正常传输模式下),因为必须设置内容长度头,Java不知道何时完成写入。因此,当您调用getInputStream()(或getResponseCode())时,Java设置内容长度头,写入请求,等待服务器开始生成响应,读取所有响应头,然后将输入流定位在响应体的开头。所有这些步骤都需要时间