我的文件大小为5MB&想通过HttpURLConnection下载(目标就像" http://...../songs/Beatles_And I Love Her.mp3")。
我试图按照以下方式进行操作
URL url = new URL("http://........../songs/Beatles_And I Love Her.mp3");
URLConnection urlConnection = url.openConnection();
HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection;
httpURLConnection.getResponseCode();
InputStream stream = httpURLConnection.getInputStream();
byte buf[] = new byte[128];
do
{
int numread = stream.read(buf);
if (numread <= 0)
{
stream.close();
break;
}
} while (true);
但问题是它只读取2KB到3KB的数据,然后返回-1并退出。
答案 0 :(得分:1)
检查响应代码(应为200)并检查所获数据的内容。
我有类似的问题。原来这是我读过的服务器的错误页面,而不是正确的文件: - )另外,请尝试使用 doesen&#t; 包含空格的文件(在服务器上重命名为Beatles_And_I_Love_Her.mp3)
答案 1 :(得分:1)
您只需在从中创建InputStream
if(httpURLConnection.getResposecode==HTTPConnection.OK){
// Do your job here
}else{
//Error in connection creation
}
答案 2 :(得分:0)
试试这个对我有用
try{
if(path != null && fileName != null){
Log.v(TAG, "downloading data");
URL url = new URL(path + fileName);
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
Log.v(TAG, "lenghtOfFile = "+lenghtOfFile);
InputStream is = url.openStream();
File testDirectory = new File(Environment.getDataDirectory().toString() + "/data/" + c.getPackageName() + "/download");
if(!testDirectory.exists()){
testDirectory.mkdir();
}
FileOutputStream fos = new FileOutputStream(testDirectory+"/" + fileName);
byte data[] = new byte[1024];
int count = 0;
long total = 0;
while ((count=is.read(data)) != -1) {
total += count;
int progress_temp = (int)(total * 100) / lenghtOfFile;
if((progress_temp % 10) == 0 && (progress != progress_temp)){
progress = progress_temp;
Log.v(TAG, "total = "+progress);
}
fos.write(data, 0, count);
}
is.close();
fos.close();
Log.v(TAG, "downloading finished");
}
}catch(Exception e){
Log.v(TAG, "exception in downloadData");
e.printStackTrace();
}
答案 3 :(得分:0)
增加缓冲区大小
byte buf[] = new byte[2048];
答案 4 :(得分:0)
更改
if (numread <= 0)
到
if (numread < 0)
正如the javadoc中所述,当你得到-1时,你应该只打破循环:
“读入缓冲区的总字节数,如果由于已到达流末尾而没有更多数据,则为-1。”
读取0字节有点奇怪,但可能会发生,因为数据已经在底层网络层的数据包中分割。