Java实现资源下载 报错HTTP response code: 416 求高手帮忙

时间:2022-10-22 23:21:03

package test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URI;
import java.net.URL;
import java.util.Random;
/**
 *
 * 实现了下载的功能*/
                                   
public class SimpleTh {
                                   
                                       
    public static void main(String[] args){
        // TODO Auto-generated method stub
         //String path = "http://www.7cd.cn/QingTengPics/倩女幽魂.mp3";//MP3下载的地址
         //String path ="http://img.99luna.com/music/%CF%EB%C4%E3%BE%CD%D0%B4%D0%C5.mp3";
         //String path = "http://localhost:8080/download/res/MPASetup.msi";
         String path = "http://localhost:8080/download/res/abc.gif";
                                           
         try {
            new SimpleTh().download(path, 3); //对象调用下载的方法
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
                                            
    }
    public static String getFilename(String path){//获得文件的名字
        return path.substring(path.lastIndexOf('/')+1);
    }
                                   
                                   
    public void download(String path,int threadsize) throws Exception//下载的方法
    {//参数 下载地址,线程数量
                                       
    URL url = new URL(path);
    HttpURLConnection conn  = (HttpURLConnection)url.openConnection();//获取HttpURLConnection对象
    conn.setRequestMethod("GET");//设置请求格式,这里是GET格式
    conn.setReadTimeout(5*1000);//
    int filelength = conn.getContentLength();//获取要下载文件的长度
    String filename = getFilename(path);
    File saveFile = new File(filename);
    RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
    accessFile.setLength(filelength);
    accessFile.close();
    int block = filelength%threadsize ==0?filelength/threadsize:filelength/threadsize+1;
     for(int threadid = 0;threadid<=threadsize;threadid++){
                                            
         new DownloadThread(url,saveFile,block,threadid).start();
     }
                                        
    }
    private final class DownloadThread extends Thread{
        private URL url;
        private File saveFile;
        private int block;//每条线程下载的长度
        private int threadid;//线程id
                                           
        public DownloadThread(URL url,File saveFile,int block,int threadid){
            this.url = url;
            this.saveFile= saveFile;
            this.block = block;
            this.threadid = threadid;
        }
                                   
        @Override
        public void run() {
            //计算开始位置的公式:线程id*每条线程下载的数据长度=?
            //计算结束位置的公式:(线程id+1)*每条线程下载数据长度-1=?
            int startposition = threadid*block;
            int endposition = (threadid+1)*block-1;
            try {
                try {
                    RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
                    accessFile.seek(startposition);//设置从什么位置写入数据
                    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setReadTimeout(5*1000);
                    conn.setRequestProperty("Range","bytes= "+startposition+"-"+endposition);
                    InputStream inStream = conn.getInputStream();
                    byte[]buffer = new byte[1024];
                    int len = 0;
                    while((len = inStream.read(buffer))!=-1){
                        accessFile.write(buffer, 0, len);
                    }
                    inStream.close();
                    accessFile.close();
                    System.out.println("线程id:"+threadid+"下载完成");
                    System.out.println("length"+accessFile);
                                                       
                } catch (FileNotFoundException e) {
                                                       
                    e.printStackTrace();
                }
            } catch (IOException e) {
                                                   
                e.printStackTrace();
            }
                                               
        }
                                           
    }
}

6 个解决方案

#1


自顶,不要沉啊!

#2


没玩过 不清楚 绑定 貌似 web
开发 不用这个

#3


416 Requested Range Not Satisfiable

Range范围不匹配。

这里:
for(int threadid = 0;threadid<=threadsize;threadid++){


似乎应该是:
for(int threadid = 0;threadid<threadsize;threadid++){

#4


引用 3 楼 xuefeng0707 的回复:
416 Requested Range Not Satisfiable

Range范围不匹配。

这里:
for(int threadid = 0;threadid<=threadsize;threadid++){


似乎应该是:
for(int threadid = 0;threadid<threadsize;threadid++){

确实是这个问题!高手啊!谢谢了!
这个下载完成后,资源放到哪儿了

#5


new File(filename)

如果filename没指定绝对路径,默认使用的路径就是:
System.getProperty("user.dir") + "/" + filename

你这里就是项目的路径下。

#6


引用 5 楼 xuefeng0707 的回复:
new File(filename)

如果filename没指定绝对路径,默认使用的路径就是:
System.getProperty("user.dir") + "/" + filename

你这里就是项目的路径下。

#1


自顶,不要沉啊!

#2


没玩过 不清楚 绑定 貌似 web
开发 不用这个

#3


416 Requested Range Not Satisfiable

Range范围不匹配。

这里:
for(int threadid = 0;threadid<=threadsize;threadid++){


似乎应该是:
for(int threadid = 0;threadid<threadsize;threadid++){

#4


引用 3 楼 xuefeng0707 的回复:
416 Requested Range Not Satisfiable

Range范围不匹配。

这里:
for(int threadid = 0;threadid<=threadsize;threadid++){


似乎应该是:
for(int threadid = 0;threadid<threadsize;threadid++){

确实是这个问题!高手啊!谢谢了!
这个下载完成后,资源放到哪儿了

#5


new File(filename)

如果filename没指定绝对路径,默认使用的路径就是:
System.getProperty("user.dir") + "/" + filename

你这里就是项目的路径下。

#6


引用 5 楼 xuefeng0707 的回复:
new File(filename)

如果filename没指定绝对路径,默认使用的路径就是:
System.getProperty("user.dir") + "/" + filename

你这里就是项目的路径下。

#7