利用JAVA获取远程文件及断点续传
2010-07-28 18:52
465 查看
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获取远程文件及使用断点续传,供学习者使用
- java 断点续传文件到远程服务器
- java web 断点续传文件 以及 获取文件的SHA-1散列值
- 利用JAVA获取远程文件及使用断点续传,供学习者使用
- java多线程文件的断点续传
- Android笔记(五):利用多线程可断点下载远程文件(已解决文件名含有中文)
- Java利用MessageDigest获取字符串或文件MD5详解
- Java利用ssh协议实现从远程Linux服务器下载文件和文件夹
- java 怎样追加文本到远程服务器上的文件,利用ftpclient
- java利用Jsch实现在windows平台获取linux服务器文件
- 加密:Java利用MessageDigest获取字符串或文件MD5详解
- Java利用MessageDigest获取字符串或文件MD5详解
- java利用jcraft实现和远程服务器交互,实现上传下载文件
- java获取远程文件(保证文件的完整性,不会出现无法打开的情况)
- [Java] 利用xpdf库获取pdf文件的指定范围文本内容
- java 利用SMB读取远程文件
- [Java] 利用xpdf库获取pdf文件的指定范围文本内容
- Java利用MessageDigest获取字符串或文件MD5详解
- Java利用MessageDigest获取字符串或文件MD5详解