java - inputStream.read 无法正常工作

标签 java sockets inputstream java-io outputstream

y我使用以下代码从互联网下载文件。

//suppose I call this method inside main(String[] st) method.
private void download(String link){
  URL url = new URL(link);
  HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  connection.setRequestProperty("Accept-Encoding", "identity");
  connection.setRequestProperty("connection", "close");
  connection.connect();
  save(connection.getInputStream());
}

private final int DOWNLOAD_BUFFER_SIZE = 10 * 1024;
  private void save(InputStream inputStream) {
    FileOutputStream fos;
    try {
      byte[] buffer = new byte[DOWNLOAD_BUFFER_SIZE];
      int len;
      fos = new FileOutputStream("FILE_PATH");
      while ((len = inputStream.read(buffer)) != -1) {
        fos.write(buffer, 0, len);
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      //close streams, flush, etc.
    }
  }

一切正常,代码工作正常。但是当我将 DOWNLOAD_BUFFER_SIZE 的值更改为 5 这样的小数字时,奇怪的事情发生了!当我将 DOWNLOAD_BUFFER_SIZE 的值更改为较小的数字并关闭互联网连接时,下载会继续一段时间并且不会停止!但是,当 DOWNLOAD_BUFFER_SIZE 的值很大(例如 10 * 1024)时,一切正常,当我关闭连接时,下载就会停止。

有人可以帮助我吗?我希望当 DOWNLOAD_BUFFER_SIZE 的值很小并且关闭互联网连接时停止下载。

我见过this链接但没有帮助。

EJP的答案不包含解决此问题的解决方案。由于某些原因,我希望 DOWNLOAD_BUFFER_SIZE 较小。

请帮助我。我需要你的帮助。请:X

如果我的句子语法不正确,我提前道歉。因为我英语说得不好。

最佳答案

因为socket接收缓冲区。里面只有这么多。如果您从中读取小块,则需要更多读取。

我不知道为什么你希望下载缓冲区的大小较小。我通常使用 4096 或 8192 字节。将其设置为 1MB 这样大的值是没有意义的,除非内核中的套接字接收缓冲区同样大。

如果您担心网络中断(您应该如此),则应该在套接字上设置读取超时。

关于java - inputStream.read 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50110128/

相关文章:

java - 解释 request.setURI

java - 在 Equinox 中配置 PostgreSQL 数据源时的 NPE

objective-c - 如何在 NSData 中创建 ip 地址和端口以使用

java - 我想知道 System.err 是如何工作的

json - 最佳实践-Json解析中的String与InputStream(使用gson)

java - Apache HttpClient CoreConnectionPNames.CONNECTION_TIMEOUT 什么都不做?

java - 如何检索节点列表中的属性值

c# - 套接字编程或 REST 服务

android - 几个小时后 TextToSpeech 停止工作

java - 程序将一个文件的数据复制到另一个文件15次