IO流

来源:互联网 发布:python idle下载 编辑:程序博客网 时间:2024/06/05 05:20

IO简介:  Input  输入  读

               Output   输出   写

这一章重点讲的是一个多线程下载:

多线程下载思路图:

上面的思路图就是分成两个部分来写一个服务器 一个客户端   服务器这边就涉及到了一些简单的公式了下面我们来看一下具体的代码实现:

服务器的类:

package Com.zking.test;import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;public class DownThread extends Thread{public int id;//线程idpublic URL url;//文件下载的路径public File file;//文件保存的路径public int singlethreadNum;//每个下载的数据量public DownThread(int id, URL url, File file, int singlethreadNum) {super();this.id = id;this.url = url;this.file = file;this.singlethreadNum = singlethreadNum;}@Overridepublic void run() {try {RandomAccessFile raf=new RandomAccessFile(file, "rwd");//分别计算每个下载的开始位置和结束位置int start=id*singlethreadNum;int end=(id+1)*singlethreadNum-1;//通过传过来的URL 获取下载的连接HttpURLConnection conn=(HttpURLConnection) url.openConnection();//设置下载超时值conn.setReadTimeout(5000);//设置一般请求属性conn.setRequestProperty("Range", "bytes="+start+"-"+end);//局部请求  状态码为206if(conn.getResponseCode()==206){raf.seek(start);//获取输入流InputStream is=conn.getInputStream();byte[] bytes=new byte[1024];int len=0;while((len=is.read(bytes, 0, bytes.length))!=-1){raf.write(bytes, 0, len);}raf.close();is.close();}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}}

客户端类:
package Com.zking.test;import java.io.File;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;public class TestDown {public static void main(String[] args) {//设置线程数int threadnum=50;//下载路径String path="http://localhost:8080/web_luopenghui/images/s8.jpg";//httpurlconnectiontry {//获取下载地址URL url=new URL(path);//通过下载地址打开连接HttpURLConnection conn=(HttpURLConnection)url.openConnection();//设定请求方式conn.setRequestMethod("GET");//判断响应码是否为200  只有200的时候才会进入这个网页if(conn.getResponseCode()==200){//获取服务器中文件的大小int length=conn.getContentLength();//保存的文件路径File f=new File("C:/s8.jpg");//对随机的文件进行读写RandomAccessFile raf=new RandomAccessFile(f,"rwd");//设置下载文件大小raf.setLength(length);raf.close();//每个线程下载的数据量int singleThreadNum= length%threadnum==0 ? length/threadnum:length/threadnum+1;for (int i = 0; i < threadnum; i++) {new DownThread(i, url, f, singleThreadNum).start();}}else{System.out.println("网页错误");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

这就是一个简单的多线程下载.