java 读取 远程文件_利用JAVA获取远程文件及使用断点续传 供学习者使用
闲来没事,就做做,程序还是要多写才好@
原理不说,文件方面及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获取远程文件及使用断点续传 供学习者使用相关推荐
- java 读取excel 图片_利用Java+POI 读写Excel文档向Excel中插入图片
一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...
- java mysql jdbc 封装_利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)...
近期看老罗的视频,跟着完毕了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完毕对数据库的增删改查.当中查询这块,包含普通的查询和利用反射完毕的查询,主要包含以下几个函数接口 ...
- php写excel文件_利用PHPExcel实现Excel文件的写入和读取
作为一个原本的Java党,用过PHP才知道,原来对于Excel文件的写入和读取原来可以这么简单! 利用PHP实现对于Excel的读取,主要借助于PHPExcel插件来完成. PHPExcel下载地址: ...
- java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作
一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档) ...
- python读取sas数据集_利用Python获取SAS和R自带数据集
图:北京-奥森公园-2018年4月 无论是SAS.R还是Python,本身都自带一些数据集,对于初学者来说,可以通过这些自带的小数据集进行编程练习,无疑是非常方便的.SAS.R作为统计分析软件,本身自 ...
- java界面设计股票_利用JAVA实现股票交易系统设计参考.doc
利用JAVA实现股票交易系统设计参考 目 录 摘要1 关键词1 Abstract2 Key words2 1 概述3 1.1 Java体系结构3 1.2 Java的优点3 1.3 Java的应用3 2 ...
- java 方法数统计_利用Java简单实现一个代码行数统计器方法实例
前言 哈喽,我是小黑, 最近学了java的输入输出流后一直心痒痒,总想找一点事情来做,所以用java代码来实现了一下统计代码的所有行数,看一下我上大学以来到底打了多少行. 先附上实现代码吧! pack ...
- java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案
本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...
- java calendar日期计算_利用Java中Calendar计算两个日期之间的天数和周数
前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...
最新文章
- 预定义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入
- Python 正则表达式(分组)
- 通过超链接访问后台方法_超有用的公众号超链接,3分钟学会2种超链接方法,特别实用!...
- 51单片机串行口的使用与串行通信
- java学习:理解final
- mysql中ip用什么存,在MySQL中,价钱和IP用什么类型存储最好?
- Docker 领衔 OpenSource.com 2014十佳开源软件排行榜
- sql server死锁_如何解决SQL Server中的死锁
- whitelist方法_Jsoup学习之Whitelist类
- java swing 复选JCheckBox组件美化
- 肿瘤全外显子--记录
- 学习scratch3.0第2章
- 1.Linux系统编程入门
- 计算机电脑上可以做作业吗,一起作业电脑版
- ASP利用IP138获IP地理位置
- 【java校招你不知道的那些事儿】java校招有没有考点大纲?不能拿面试补缺
- 3D模型文件(STL格式)Python读取并解析体积、长、宽、高信息
- excel综合应用(一):信息查询
- 爬虫学习经验分享-------某点评网站
- 快手市值万亿、炒股如同炒币,资本市场正在币圈化?
热门文章
- 订阅号助手App发布 手机也能管理公众号了
- 函数-生成器之斐波拉契数列
- epoll 的accept , read, write
- python检测变量是否有定义(即使用前检查是否定义好)
- Js中的callback机制
- vs.net web项目使用visual source safe进行源代码管理(转)
- 如何清理由cmake生成的项目文件?
- 会员日亚马逊工人罢工:反抗“与机器比速度”的考核制!
- 报Access数据库不存在或者打不开的错误
- html做旋转的五角星,如何用几何画板制作旋转的五角星