java断点续传 http_http断点续传简单实现(java)
[月影读书频道 http://wf66.com/]
fileSplitterFetch.splitterStop();
}
}
//负责部分文件的抓取
**FileSplitterFetch.java
*/
package NetFox;
import java.io.*;
import java.net.*;
public class FileSplitterFetch extends Thread {
String sURL; //File URL
long nStartPos; //File Snippet Start Position
long nEndPos; //File Snippet End Position
int nThreadID; //Thread's ID
boolean bDownOver = false; //Downing is over
boolean bStop = false; //Stop identical
FileAccessI fileAccessI = null; //File Access interface
public FileSplitterFetch(String sURL,String sName,long nStart,long nEnd,int id) throws IOException
{
this.sURL = sURL;
this.nStartPos = nStart;
this.nEndPos = nEnd;
nThreadID = id;
fileAccessI = new FileAccessI(sName,nStartPos);//定位
}
public void run()
{
while(nStartPos < nEndPos && !bStop)
{
try{
URL url = new URL(sURL);
HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection ();
httpConnection.setRequestProperty("User-Agent","NetFox");
String sProperty = "bytes="+nStartPos+"-";
httpConnection.setRequestProperty("RANGE",sProperty);
Utility.log(sProperty);
InputStream input = httpConnection.getInputStream();
//logResponseHead(httpConnection);
byte[] b = new byte[1024];
int nRead;
while((nRead=input.read(b,0,1024)) > 0 && nStartPos < nEndPos && !bStop)
{
nStartPos += fileAccessI.write(b,0,nRead);
//if(nThreadID == 1)
// Utility.log("nStartPos = " + nStartPos + ", nEndPos = " + nEndPos);
}
Utility.log("Thread " + nThreadID + " is over!");
bDownOver = true;
//nPos = fileAccessI.write (b,0,nRead);
}
catch(Exception e){e.printStackTrace ();}
}
}
//打印回应的头信息
public void logResponseHead(HttpURLConnection con)
{
for(int i=1;;i++)
{
String header=con.getHeaderFieldKey(i);
if(header!=null)
//responseHeaders.put(header,httpConnection.getHeaderField(header));
Utility.log(header+" : "+con.getHeaderField(header));
else
break;
}
}
public void splitterStop()
{
bStop = true;
}
}
/*
**FileAccess.java
*//文件访问(定位,写)
package NetFox;
import java.io.*;
public class FileAccessI implements Serializable{//RandomAccessFile类用于在任意一个文件的特定位置上读/写字节
RandomAccessFile oSavedFile;
long nPos;
public FileAccessI() throws IOException
{
this("",0);
}
public FileAccessI(String sName,long nPos) throws IOException
{
oSavedFile = new RandomAccessFile(sName,"rw");
this.nPos = nPos;
oSavedFile.seek(nPos);
}
public synchronized int write(byte[] b,int nStart,int nLen)
{
int n = -1;
try{
oSavedFile.write(b,nStart,nLen);
n = nLen;
}
catch(IOException e)
{
e.printStackTrace ();
}
return n;
}
}
/*
**SiteInfoBean.java
*/
package NetFox;
public class SiteInfoBean {
private String sSiteURL; //Site's URL
private String sFilePath; //Saved File's Path
private String sFileName; //Saved File's Name
private int nSplitter; //Count of Splited Downloading File
public SiteInfoBean()
{//nSplitter的缺省值为5
//default value of nSplitter is 5
this("","","",5);
}
public SiteInfoBean(String sURL,String sPath,String sName,int nSpiltter)
{
sSiteURL= sURL;
sFilePath = sPath;
sFileName = sName;
this.nSplitter = nSpiltter;
}
public String getSSiteURL()
{
return sSiteURL;
}
public void setSSiteURL(String value)
{
sSiteURL = value;
}
public String getSFilePath()
{
return sFilePath;
}
public void setSFilePath(String value)
{
sFilePath = value;
}
public String getSFileName()
{
return sFileName;
}
public void setSFileName(String value)
{
sFileName = value;
}
public int getNSplitter()
{
return nSplitter;
}
public void setNSplitter(int nCount)
{
nSplitter = nCount;
}
}
/*
**Utility.java
*/
package NetFox;
public class Utility {
public Utility()
{
}//线程睡眠
public static void sleep(int nSecond)
{
try{
Thread.sleep(nSecond);
}
catch(Exception e)
{
e.printStackTrace ();
}
}//日志
public static void log(String sMsg)
{
System.err.println(sMsg);
}
public static void log(int sMsg)
{
System.err.println(sMsg);
}
}
/*
**TestMethod.java
*/
package NetFox;
public class TestMethod {
public TestMethod()
{ ///xx/weblogic60b2_win.exe
try{
SiteInfoBean bean = new SiteInfoBean("http://localhost/xx/weblogic60b2_win.exe","L:\temp","weblogic60b2_win.exe",5);
//SiteInfoBean bean = new SiteInfoBean("http://localhost:8080/down.zip","L:\temp","weblogic60b2_win.exe",5);
SiteFileFetch fileFetch = new SiteFileFetch(bean);
fileFetch.start();
}
catch(Exception e){e.printStackTrace ();}
}
public static void main(String[] args)
{
new TestMethod();
}
}
对该文的评论 :
主要就是206响应和Content-Range罢了 sjjf。
trace:
我写过用socket实现的http断点下载的程序,其实写起来不难,关键是你要看懂蚂蚁里面的日志和RFC中的http协议
---------------------------------------Powered by DvNews.net
java断点续传 http_http断点续传简单实现(java)相关推荐
- java ssh客户端_简单的Java SSH客户端
java ssh客户端 可以使用jcabi-ssh在Java中通过几行代码通过SSH执行shell命令: String hello = new Shell.Plain(new SSH("ss ...
- java 静态块初始化_简单了解java中静态初始化块的执行顺序
这篇文章主要介绍了简单了解java中静态初始化块的执行顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在java中,其应该是先于所有的方法执行. ...
- java mapreduce程序_简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行...
[TOC] 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行 程序源码 import java.io.IOException; import java.util. ...
- eclipse 如何关联git_作为一名初学Java者 如何做简单的Java项目
作为一名初学Java者而言,如何做简单的Java项目?想要更有效率的学习Java技术,理论中穿插项目练习很有必要.但项目练习要在你掌握了一定的技术之后才能做的,它是用来加深你对技术理解的. 就拿Jav ...
- java开发框架 double_最简单的Java框架
框架framework的目的是定义骨架式方案,处理各种相同的底层细节:而开发人员使用框架时,能够依照自己的需求实现自己的功能--仅仅须要填入自己的东西/flesh. 最简单的框架,类似于JUnit,它 ...
- java event事件_简单的Java Event-事件框架
自己写的一个简单的Java事件框架.目前具备以下功能: 1.通过继承Event类,用户可自定义事件. 2.通过EventService 的fireEvent(Event e) 发出一个事件. 3.通过 ...
- java ear包_简单介绍Java 的JAR包、EAR包、WAR包区别
原标题:简单介绍Java 的JAR包.EAR包.WAR包区别 WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件.War专 ...
- java语言say方法,简单了解Java方法的定义和使用实现详解
简单了解Java方法的定义和使用实现详解 发布时间:2020-09-25 11:36:07 来源:脚本之家 阅读:78 作者:OLIVER_QIN 这篇文章主要介绍了简单了解Java方法的定义和使用实 ...
- java socket程序_java 简单的java socket程序
//服务器端:ServerDemo.java import java.io.DataInputStream; import java.io.DataOutputStream; import java. ...
最新文章
- 基于Linux GlassFish v3 配置取代tomcat
- oracle归档日志写满错误解决方法
- 他,跳槽季用这样的方法复习进了阿里
- 错误: 找不到或无法加载主类 com.leyou.LeyouItemApplication Process finished with exit code 1...
- 标准C程序设计七---66
- 匿名内部类使用外部变量为什么必须是final修饰的
- 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵
- 零基础学习 Python 之前期准备
- linux 进程 异常日志,linux后台启动程序,处理nohup日志太大的问题
- C++ 信号处理 signal(SIGINT, signalHandler);
- 关于使用Curvy插件实现物体沿指定路径移动的方法
- 简化版WIN7安装打印机时提示“打印机无法安装,打印处理器不存在。”正确处理方法...
- html怎么定义submit,HTML Input Submit value用法及代码示例
- win10和win11系统qq远程不能控制(点不动)的终极解决方法
- GET获取表单数据的方法
- 2022讯飞——糖尿病遗传风险检测挑战赛解决方案
- 【Cmake】初识CMake(一)
- 数据分析+数据挖掘暑期实习碎碎念
- 图片存放在服务器还是数据库里的解释?
- 店铺宝贝标题该怎么优化
热门文章
- python的重点_python知识点
- Mybatis源码之数据源模块分析
- redis 关系数据库怎么转换 和_redis数据库设计(转)
- / 卡路里_最大卡路里
- 程序员简历工作模式_简历的完整形式是什么?
- isinstance_Java类class isInstance()方法及示例
- 在JavaScript中以Hours24:Minutes:Seconds格式获取当前时间
- ruby推送示例_Ruby直到示例循环
- C#获取屏幕大小的“简单整理”。。
- 华为交换机S3700端口基本配置