`
wangyu070707
  • 浏览: 13114 次
  • 性别: 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);
}
}

分享到:
评论

相关推荐

    c#实现断点下载

    在IT领域,断点下载是一种常见的网络下载技术,它允许用户在下载大文件时暂停、恢复,而无需从头开始。在本主题中,我们将详细探讨如何使用C#语言实现断点下载的功能。 首先,理解断点下载的核心原理至关重要。断点...

    Java 实现的断点下载

    Java 断点下载技术是Java编程中用于网络文件下载的一种高效方法,特别是在处理大文件时,它允许用户中断和恢复下载过程。断点下载的基本原理是通过保存已下载部分的信息,如下载的总长度、已下载的字节数以及当前...

    htp多线程断点下载文件

    "htp多线程断点下载文件"这一主题,涉及了网络编程、多线程技术和文件处理等多个知识点。 首先,HTTP(超文本传输协议)是我们浏览网页和下载文件的基础,它是应用层协议,负责客户端和服务器之间的通信。然而,...

    Android OkHttp断点下载

    在Android开发中,OkHttp和RxJava的结合可以实现高效的网络请求处理,其中包括断点下载功能。断点下载是指在用户暂停下载后,可以从上次停止的位置继续下载,避免了重新开始下载大文件的不便。本篇文章将深入探讨...

    FTP断点上传与断点下载

    在大型文件传输时,断点上传和断点下载功能显得尤为重要,因为它们允许用户在文件传输中断后从上次停止的位置继续,而无需重新开始整个过程,这大大提高了效率并节省了时间。 **断点上传** 断点上传是指在文件传输...

    网络下载断点下载加列表

    在IT行业中,网络下载是一项常见的任务,而"断点下载"和"列表"是这个领域中的两个关键概念。断点下载允许用户在中断后从上次停止的位置继续下载,极大地提高了下载效率,尤其是在处理大文件时。列表则通常用于组织和...

    Android文件断点下载

    在Android平台上,文件断点下载是一项重要的功能,尤其对于大文件的下载,它允许用户在任意时间暂停并恢复下载过程,而不会丢失已下载的数据。本文将深入探讨如何使用HttpURLConnection实现这一功能。 首先,理解...

    android通知栏,断点下载

    在Android系统中,通知栏是用户与应用交互的重要途径,特别是在后台运行任务或者进行长时间操作时,如断点下载。断点下载是指在一个文件下载过程中,如果因为网络问题或者其他原因中断,可以在下次重新开始下载时从...

    retrofit实现多线程断点下载,可暂停,开始

    在Android开发中,为了提供更好的用户体验,我们常常需要实现文件的多线程断点下载功能。这不仅可以提高下载速度,还能允许用户在任何时候暂停或继续下载。本篇将重点讲解如何利用Retrofit库和GreenDao数据库来实现...

    OKHttp多线程断点下载

    【OKHttp多线程断点下载】是一种在Android或Java应用中实现高效文件下载的方法,它结合了OKHttp网络库的优秀性能与多线程技术,以提高下载速度,并允许在下载过程中中断和恢复,避免因网络问题或其他因素导致的下载...

    多线程断点下载

    多线程断点下载是一种高效的网络数据下载技术,尤其在处理大文件时,它能显著提高下载速度并允许用户在中断后从上次停止的地方继续。这个技术在Java和Android平台上得到了广泛的应用。以下是对这一技术的详细解释: ...

    android多线程断点下载

    在Android开发中,多线程断点下载是一项重要的技术,特别是在处理大文件或者网络环境不稳定的情况下,能够提高下载效率并确保下载的连续性。本文将详细介绍如何在Android中实现多线程断点下载,以及如何封装一个易于...

    swift-JLDownLoadManager一个断点下载工具封装自urlsession支持断点下载

    Swift中的JLDownLoadManager是一个基于URLSession的断点下载工具,专为iOS开发者设计,以简化文件的下载过程,并确保在下载过程中即使应用程序被关闭或设备重启,也能继续从上次中断的位置开始下载。这个库充分利用...

    多线程 断点续下以及非断点下载程序源码

    这里我们将深入探讨这两个知识点,以及如何将它们结合起来实现一个非断点下载程序。 首先,多线程(Multi-threading)是操作系统中并发执行任务的一种方式。在Java、C++或Python等编程语言中,开发者可以创建多个...

    Android多线程断点下载(优化)

    在Android开发中,多线程断点下载是一种常见的优化策略,尤其在处理大文件时,如应用程序、视频或音频文件的下载。这种技术允许用户在任何时间暂停下载,并在稍后从停止的地方继续,而无需重新开始。在本文中,我们...

    springMvc实现文件断点下载

    在这个特定的项目中,我们关注的是如何使用Spring MVC来实现文件的断点下载功能。断点下载是允许用户在中断下载后从上次停止的地方继续下载的技术,这对于大文件下载尤其有用,因为它可以提高用户体验并减少网络资源...

    Android断点下载示例

    在Android开发中,断点下载是一项非常实用的功能,它允许用户在任意时刻中断下载任务,之后可以从上次停止的地方继续下载,极大地提高了用户体验。本示例是专为Android初学者设计的,通过详细的代码注释,旨在帮助...

    iOS 开发中的视屏断点下载模板

    在iOS开发中,视频断点下载是一个常见的需求,特别是在用户需要下载大容量视频时,为了提高用户体验和节省网络资源,断点续传技术显得尤为重要。本文将深入探讨iOS开发中的视频断点下载模板,以及如何实现这一功能。...

    android 多线程文件断点下载

    在Android开发中,多线程文件断点下载是一项重要的技术,尤其对于大文件的下载,它能显著提高下载效率并提供更好的用户体验。断点下载允许用户在任何时间暂停下载,并在之后从停止的地方继续,而不会丢失已下载的...

    易语言HTTP断点下载

    在本主题“易语言HTTP断点下载”中,我们将深入探讨如何使用易语言实现HTTP协议的断点下载功能,以及如何结合进度条展示下载进度。 HTTP是互联网上应用最为广泛的一种网络协议,用于从Web服务器传输超文本到本地...

Global site tag (gtag.js) - Google Analytics