获取下载文件的文件名和段下载

时间:2016-09-12 09:45:49

标签: java multithreading

这是我使用线程从指定的URL下载文件的代码。我想进行多线程下载,但我无法解决它。我想得到下载的文件名与URL + part.1,2,3等文件的名称相同。你们可以帮帮我吗?对不起我糟糕的英语语法!我最喜欢测试的链接是:https://docs.oracle.com/javaee/7/JEETT.pdf 一切都提前了!

public class Threadtest extends Thread {
    String s ;

    public void InputUrl(){

        Scanner sc = new Scanner(System.in);
        System.out.println("Input URL :");
        s = sc.nextLine();


    }   
    public void run(){

        BufferedInputStream bis = null ;
        RandomAccessFile raf = null ; 
        HttpURLConnection conn = null;
        URL mUrl = null ;
        String a = new File(mUrl.getPath().toString()).getName();           
         try{

             mUrl = new URL(s);
              conn = (HttpURLConnection)mUrl.openConnection();
              String byteRange = 0+ "-" + 1024;
                conn.setRequestProperty("Range", "bytes=" + byteRange);

             conn.connect();    
             bis = new BufferedInputStream(conn.getInputStream());
                raf = new RandomAccessFile(a, "rw");
                raf.seek(0);

             byte[] buffer = new byte[4092];
             int count = 0 ;
             while ((count = bis.read(buffer,0,4092))!= -1)
             {

                raf.write(buffer, 0 ,count);
             }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

} 

1 个答案:

答案 0 :(得分:0)

扩展Thread并不是一个好主意。根据哲学原因,更好的是实现Runnable接口。

class DownloadTask implements Runnable {

    private final URL url;

    DownloadTask(URL url) {
        this.url = url;
    }

    @Override
    public void run() {
        // download code
    }
}

现在我们只能下载代码。下一步是使用Executor Framework执行下载任务。

class Downloader{

    private static boolean exitFlag;

    public static void main(String[] args) {
        ExecutorService pool = Executors.newCachedThreadPool();
        while(exitFlag) {
            URL fileUrl = readUrlFromUserOrSetExit();
            pool.execute(new DownloadTask(fileUrl));
        }
        pool.shutdown();
    }

    private static URL readUrlFromUserOrSetExit() {
        // read from user of set exit flag
    }
}

它是如何运作的?

  • 您创建一个名为pool的执行程序,负责所有"线程魔法"。
  • 虽然用户未将退出命令放入您读取文件URL
  • 创建DownloadTask实例
  • 将其发送至poolexecute
  • 如果用户输入exit命令,则shutdown执行者。

如果您不想使用外部库,这可能是最简单的方法。