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 **
答案 0 :(得分: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请求。
答案 1 :(得分: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();
}
}