一路拾遗
Collect By Finding All The Way ......
posts - 81,comments - 41,trackbacks - 0
目前不支持断点续传,主要有以下两个类实现:
1.线程类:DownloadThread .java
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownloadThread extends Thread
    
private InputStream randIn; 
    
private RandomAccessFile randOut; 
    
private URL url; 
    
private long block; 
    
private int threadId=-1
    
private boolean done=false
    
    
public DownloadThread(URL url,RandomAccessFile out,long block,int threadId)
    

        
this.url=url; 
        
this.randOut=out; 
        
this.block=block; 
        
this.threadId=threadId; 
    }
 
    
public void run()
    

        
try
          HttpURLConnection http
=(HttpURLConnection)url.openConnection(); 
          http.setRequestProperty(
"Range","bytes="+block*(threadId-1)+"-"); 
          randIn
=http.getInputStream(); 
        }
 
        
catch(IOException e)
          System.err.println(e); 
        }
 

      
byte [] buffer=new byte[1024]; 
       
int offset=0
       
long localSize=0
       System.out.println(
"线程"+threadId+"开始下载"); 
       
try 
          
while ((offset = randIn.read(buffer)) != -1&&localSize<=block) 
          randOut.write(buffer,
0,offset); 
          localSize
+=offset; 
          }
 
          randOut.close(); 
          randIn.close(); 
          done
=true
          System.out.println(
"线程"+threadId+"完成下载"); 
          
this.interrupt(); 
       }
 
       
catch(Exception e)
          System.err.println(e); 
       }
 
    }
 
      
public boolean isFinished()
         
return done; 
      }
 
}

2.使用多线程下载:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class DownloadMultiThread 
    
private File fileOut; 
    
private URL url; 
    
private long fileLength=0;
 
    
//初始化线程数 
    private int ThreadNum=1

    
public DownloadMultiThread(String urlString)
    

        
try
        

            System.out.println(
"正在链接URL:" + urlString); 
            url
=new URL(urlString); 
            HttpURLConnection urlcon
=(HttpURLConnection)url.openConnection(); 
            fileLength
=urlcon.getContentLength(); 
            
if(urlcon.getResponseCode()>=400)
            

                System.out.println(
"服务器响应错误!"); 
                System.exit(
-1); 
            }
 
            
if(fileLength<=0
                System.out.println(
"无法获知文件大小"); 
    
            System.out.println(
"文件大小为"+fileLength/1024+"K"); 
            
//获取文件名 
            
            ThreadNum 
= (int) (fileLength/(1024*5+ 1);
            
if(ThreadNum>=10)ThreadNum=10;
            String trueurl
=urlcon.getURL().toString(); 
            String filename
=trueurl.substring(trueurl.lastIndexOf('/')+1); 
            fileOut
=new File("D://",filename); 
        }
 
        
catch(MalformedURLException e)
            System.err.println(e); 
        }
 
        
catch(IOException e)
            System.err.println(e); 
        }
 
        init(); 
    }
 
    
    
   
private void init()
      DownloadThread [] down
=new DownloadThread[ThreadNum]; 
   
try 
      
for(int i=0;i<ThreadNum;i++)
         RandomAccessFile randOut
=new RandomAccessFile(fileOut,"rw"); 
         randOut.setLength(fileLength); 
         
long block=fileLength/ThreadNum+1
         randOut.seek(block
*i); 
         down[i]
=new DownloadThread(url,randOut,block,i+1); 
         down[i].setPriority(
7); 
         down[i].start(); 
      }
 
   
//循环判断是否下载完毕 
   boolean flag=true
   
while (flag) 
      Thread.sleep(
100); 
      flag 
= false
      
for (int i = 0; i < ThreadNum; i++
      
if (!down[i].isFinished()) 
      flag 
= true
      
break
      }
 

     System.out.println(
"文件下载完毕,保存在:"+fileOut.getPath() );
   }
 catch (FileNotFoundException e) 
         System.err.println(e); 
         e.printStackTrace(); 
   }
 
   
catch(IOException e)
      System.err.println(e); 
      e.printStackTrace(); 
   }
 
   
catch (InterruptedException e) 
   System.err.println(e); 
   }
 

}
 

    
public static void main(String[] args) 
           
new DownloadMultiThread("http://www.baidu.com/img/baidu_logo.gif"); 
           
           System.out.println(
"baidu finish!"); 
    }
 

}
 
posted on 2008-09-21 11:50 胖胖泡泡 阅读(1467) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: