`
wangyu070707
  • 浏览: 12637 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

断点下载

阅读更多
package com.project.test;

import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.net.*;

/**
* 文件传送客户端:获取远程文件
*/
public class GetRemoteFile_Client_GoOn {
public GetRemoteFile_Client_GoOn() {
}

private boolean FileExist(String pathAndFile)// 确定文件是否已经下载,但没有下载完成
{
   File file = new File(pathAndFile);
   if (file.exists())
    return true;
   else
    return false;
}

private long FileSize(String pathAndFile)// 确定已经下载了的文件大小
{
   File file = new File(pathAndFile);
   return file.length();
}

private void FileRename(String fName, String nName)// 将下载完全的文件更名,去掉.tp名
{
   File file = new File(fName);
   file.renameTo(new File(nName));
   file.delete();
}

public static void main(String[] args) {
   URL url = null;
   HttpURLConnection urlc = null;
   DataOutputStream dos = null;
   BufferedInputStream bis = null;
   FileOutputStream fos = null;
   String localFile = "d:\\x.x";// 文件保存的地方及文件名,具体情况可以改
   String localFile_bak = localFile + ".tp";// 未下载完文件加.tp扩展名,以便于区别
   GetRemoteFile_Client_GoOn gco = new GetRemoteFile_Client_GoOn();
   long fileSize = 0;
   long start = System.currentTimeMillis();
   int len = 0;
   byte[] bt = new byte[1024];
   // byte[] buffer=new byte[50*1024];
   RandomAccessFile raFile = null;
   long TotalSize = 0;// 要下载的文件总大小
   try {
    url = new URL(
      "http://www.operamasks.org/download/document/OperaMasks_Studio_Getting_Started.pdf");
    urlc = (HttpURLConnection) url.openConnection();
    TotalSize = Long.parseLong(urlc.getHeaderField("Content-Length"));
    System.out.println("下载文件大小为:" + TotalSize);
    urlc.disconnect();// 先断开,下面再连接,否则下面会报已经连接的错误
    urlc = (HttpURLConnection) url.openConnection();
    // 确定文件是否存在
    if (gco.FileExist(localFile_bak))// 采用断点续传,这里的依据是看下载文件是否在本地有.tp有扩展名同名文件
    {
     System.out.println("文件续传中...");
     fileSize = gco.FileSize(localFile_bak); // 取得文件在小,以便确定随机写入的位置
     System.out.println("fileSize:" + fileSize);
     // 设置User-Agent
     // urlc.setRequestProperty("User-Agent","NetFox");
     // 设置断点续传的开始位置
     urlc.setRequestProperty("RANGE", "bytes=" + fileSize + "-");
     // urlc.setRequestProperty("RANGE",
     // "bytes="+fileSize);//这样写不行,不能少了这个"-".
     // 设置接受信息
     urlc.setRequestProperty("Accept",
       "image/gif,image/x-xbitmap,application/msword,*/*");
     raFile = new RandomAccessFile(localFile_bak, "rw");// 随机方位读取
     raFile.seek(fileSize);// 定位指针到fileSize位置
     bis = new BufferedInputStream(urlc.getInputStream());
     while ((len = bis.read(bt)) > 0)// 循环获取文件
     {
      raFile.write(bt, 0, len);
      // buffer=buffer+bt;
      // System.
     }
     System.out.println("文件续传接收完毕!");
    } else// 采用原始下载
    {
     fos = new FileOutputStream(localFile_bak); // 没有下载完毕就将文件的扩展名命名.bak
     dos = new DataOutputStream(fos);
     bis = new BufferedInputStream(urlc.getInputStream());
     System.out.println("正在接收文件...");
     int test = 0;
     while ((len = bis.read(bt)) > 0)// 循环获取文件
     {
      dos.write(bt, 0, len);
      test++;
      if (test == 50)// 这里是测试,你可以删除这里,就可以正常下载了
       break;
     }
     System.out.println("文件正常接收完毕!");
    }
    System.out.println("共用时:" + (System.currentTimeMillis() - start)/ 1000);
    if (bis != null)
     bis.close();
    if (dos != null)
     dos.close();
    if (fos != null)
     fos.close();
    if (raFile != null)
     raFile.close();
    System.out.println("localFile_bak:" + gco.FileSize(localFile_bak));
    if (gco.FileSize(localFile_bak) == TotalSize)// 下载完毕后,将文件重命名
    {
     gco.FileRename(localFile_bak, localFile);
    }
    System.exit(0);
   } catch (Exception e) {
    try {
     if (bis != null)
      bis.close();
     if (dos != null)
      dos.close();
     if (fos != null)
      fos.close();
     if (raFile != null)
      raFile.close();
    } catch (IOException f) {
     f.printStackTrace();
    }
    e.printStackTrace();
   }
   System.exit(0);
}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics