闲来没事,就做做,程序还是要多写才好@

原理不说,文件方面及I/O方面,去BAIDU一下就知道,断点续传的原理也很简单,就是在原来已经下载的基础之上继续下载就可以了,用到了这么关键的一句:urlc.setRequestProperty("RANGE", "bytes="+fileSize+"-");其它就应该很简单吧.

/**

* 文件传送客户端:获取远程文件,并采用断点续传原理

* 软件很简单,写这个东东经历了三个步子:

* 1、写了一个文件传送程序,基于客户端与服务端

* 2、写了一个从网上获取文件的程序,学了怎么样使用:HttpURLConnection及URL

* 3、就是现在这个程序,在2的基础之上加上了断点续传的原理。

* 不过,功能虽然是达到了,不过,里面还有很多不如意的地方,慢慢改进吧,特别是效率方面

* 如果有实际需要,可以把这个改成线程的,很简单了哦。

* 准备做第四个版本:多线程文件下载。

*/

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.netbox.cn/download/nbsetup.EXE");

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);

}

}

java 读取 远程文件_利用JAVA获取远程文件及使用断点续传 供学习者使用相关推荐

  1. java 读取excel 图片_利用Java+POI 读写Excel文档向Excel中插入图片

    一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...

  2. java mysql jdbc 封装_利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)...

    近期看老罗的视频,跟着完毕了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完毕对数据库的增删改查.当中查询这块,包含普通的查询和利用反射完毕的查询,主要包含以下几个函数接口 ...

  3. php写excel文件_利用PHPExcel实现Excel文件的写入和读取

    作为一个原本的Java党,用过PHP才知道,原来对于Excel文件的写入和读取原来可以这么简单! 利用PHP实现对于Excel的读取,主要借助于PHPExcel插件来完成. PHPExcel下载地址: ...

  4. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作

    一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档) ...

  5. python读取sas数据集_利用Python获取SAS和R自带数据集

    图:北京-奥森公园-2018年4月 无论是SAS.R还是Python,本身都自带一些数据集,对于初学者来说,可以通过这些自带的小数据集进行编程练习,无疑是非常方便的.SAS.R作为统计分析软件,本身自 ...

  6. java界面设计股票_利用JAVA实现股票交易系统设计参考.doc

    利用JAVA实现股票交易系统设计参考 目 录 摘要1 关键词1 Abstract2 Key words2 1 概述3 1.1 Java体系结构3 1.2 Java的优点3 1.3 Java的应用3 2 ...

  7. java 方法数统计_利用Java简单实现一个代码行数统计器方法实例

    前言 哈喽,我是小黑, 最近学了java的输入输出流后一直心痒痒,总想找一点事情来做,所以用java代码来实现了一下统计代码的所有行数,看一下我上大学以来到底打了多少行. 先附上实现代码吧! pack ...

  8. java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案

    本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...

  9. java calendar日期计算_利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...

最新文章

  1. 预定义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入
  2. Python 正则表达式(分组)
  3. 通过超链接访问后台方法_超有用的公众号超链接,3分钟学会2种超链接方法,特别实用!...
  4. 51单片机串行口的使用与串行通信
  5. java学习:理解final
  6. mysql中ip用什么存,在MySQL中,价钱和IP用什么类型存储最好?
  7. Docker 领衔 OpenSource.com 2014十佳开源软件排行榜
  8. sql server死锁_如何解决SQL Server中的死锁
  9. whitelist方法_Jsoup学习之Whitelist类
  10. java swing 复选JCheckBox组件美化
  11. 肿瘤全外显子--记录
  12. 学习scratch3.0第2章
  13. 1.Linux系统编程入门
  14. 计算机电脑上可以做作业吗,一起作业电脑版
  15. ASP利用IP138获IP地理位置
  16. 【java校招你不知道的那些事儿】java校招有没有考点大纲?不能拿面试补缺
  17. 3D模型文件(STL格式)Python读取并解析体积、长、宽、高信息
  18. excel综合应用(一):信息查询
  19. 爬虫学习经验分享-------某点评网站
  20. 快手市值万亿、炒股如同炒币,资本市场正在币圈化?

热门文章

  1. 订阅号助手App发布 手机也能管理公众号了
  2. 函数-生成器之斐波拉契数列
  3. epoll 的accept , read, write
  4. python检测变量是否有定义(即使用前检查是否定义好)
  5. Js中的callback机制
  6. vs.net web项目使用visual source safe进行源代码管理(转)
  7. 如何清理由cmake生成的项目文件?
  8. 会员日亚马逊工人罢工:反抗“与机器比速度”的考核制!
  9. 报Access数据库不存在或者打不开的错误
  10. html做旋转的五角星,如何用几何画板制作旋转的五角星