Java多连接下载
我想得到一些建议,我已经开始了一个新项目来创建一个将使用多个连接的java下载加速器。 我想知道如何最好地解决这个问题。
到目前为止,我已经发现我可以使用HttpUrlConnection并使用range属性,但想知道这样做的有效方法。 一旦我从多个连接下载了部件,我就必须加入这些部件,以便我们最终得到一个完全下载的文件。
提前致谢 :)
- 获取要下载的文件的内容长度 。
- 根据标准(大小,速度,……) 划分它。
- 运行多个线程从不同位置开始下载文件,
并将它们保存在不同的文件中:myfile.part1
,myfile.part2
,… - 下载后,将部件合并为一个文件 。
我尝试了以下代码来获取内容长度:
public Downloader(String path) throws IOException { int len = 0; URL url = new URL(path); URLConnection connectUrl = url.openConnection(); System.out.println(len = connectUrl.getContentLength()); System.out.println(connectUrl.getContentType()); InputStream input = connectUrl.getInputStream(); int i = len; int c = 0; System.out.println("=== Content ==="); while (((c = input.read()) != -1) && (--i > 0)) { System.out.print((char) c); } input.close(); }
这是一个加入文件的示例代码:
public void join(String FilePath) { long leninfile=0, leng=0; int count=1, data=0; try { File filename = new File(FilePath); RandomAccessFile outfile = new RandomAccessFile(filename,"rw"); while(true) { filename = new File(FilePath + count + ".sp"); if (filename.exists()) { RandomAccessFile infile = new RandomAccessFile(filename,"r"); data=infile.read(); while(data != -1) { outfile.write(data); data=infile.read(); } leng++; infile.close(); count++; } else break; } outfile.close(); } catch(Exception e) { e.printStackTrace(); } }
如果您想在下载后避免加入细分,可以使用FileChannel
。
使用FileChannel
,您可以写入文件的任何位置(即使有多个线程)。
所以你可以先分配整个文件,然后再分配
在他们进来时写下他们所属的片段。
有关详细信息,请参阅Javadocs页面 。
JDownloader是我见过的最好的下载器。 如果您感兴趣,它是开源的,当然您可以从他们的代码中学到很多东西。
- 如何将JSON对象流式传输到HttpURLConnection POST请求
- 如何使用HttpURLConnection在Java中等待Expect 100-continue响应
- 如何在JAVA中保存来自HTTPSurl的文件?
- 是否可以仅使用JDK或HttpComponents处理JSON响应?
- URLConnection没有得到字符集
- 在Java中,有多接近连接并使用HttpURLConnection释放端口/套接字?
- 检查HTTP POST请求的内容类型到Java servlet
- 使用HttpClient模拟HTTP POST的问题
- HttpURLConnection getInputStream()有一秒延迟