-1
String thisurl ="http://songolum.com/file/ppdVkTxqhwcJu-CAzCgtNeICMi8mHZnKQBgnksb5o2Q/Ed%2BSheeran%2B-%2BPerfect.mp3?r=idz&dl=311&ref=ed-sheran-perfect";
url = null;
try {
     url = new URL(thisurl);
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            try {
              //  urlConnection.setRequestProperty("Transfer-Encoding", "chunked");
                urlConnection.setRequestProperty("Accept-Encoding", "identity");
                urlConnection.setDoOutput(true);
                urlConnection.setChunkedStreamingMode(0);

int l=0;
      InputStream in = new BufferedInputStream(urlConnection.getInputStream());
      while(in.read()!=-1)
            {
            l=l+in.read();
            }
      System.out.println("Content-length" +l);

**我用其他软件检查过,我发现它是 gzip 压缩文件,它有 10mb,我快 1mb **

4

2 回答 2

1

要直接回答您的问题,您出错了,因为您调用了 read() 两次,还因为您将读取的每个字节的值加在一起,而不是计算它们。InputStream.read()读取一个字节并返回其值,或在 EOF 上返回 -1。您需要将多个字节读入缓冲区并计算每个 read() 调用返回的字节数:

  InputStream in = urlConnection.getInputStream();
  byte[] buffer = new byte[4096];
  int countBytesRead;
  while((countBytesRead = in.read(buffer)) != -1) {
      l += countBytesRead;
  }
  System.out.println("Content-length: " + l);

但是,我怀疑这并不是您真正需要做的。上面的代码将简单地返回响应中所有内容的大小,包括 HTTP 标头和内容。也许您正在寻找的是文档(或要下载的文件)的长度。您可以Content-length为此目的使用 HTTP 标头(有关如何获取 HTTP 标头,请参阅其他 SO 问题)。

另外,请注意,内容可能会或可能不会经过 gzip 压缩。这取决于 HTTP 请求说它接受什么。

于 2017-11-22T13:23:10.387 回答
0

请尝试这个,希望对您有所帮助。

使用 HEAD 请求,我让我的网络服务器回复正确的内容长度字段,否则这是错误的。我不知道这是否普遍有效,但就我而言,它确实有效:

private int tryGetFileSize(URL url) {
    HttpURLConnection conn = null;
    try {
        conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("HEAD");
        conn.getInputStream();
        return conn.getContentLength();
    } catch (IOException e) {
        return -1;
    } finally {
        conn.disconnect();
    }
}
于 2017-11-22T11:59:46.573 回答