这是我使用线程从指定的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();
}
}
}
答案 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
的执行程序,负责所有"线程魔法"。DownloadTask
实例pool
至execute
。 shutdown
执行者。如果您不想使用外部库,这可能是最简单的方法。