要求是有一个方法输入两个参数一个是http://www.yahoo.com.cn另一个是把这个文件存到哪里
1.是在客户端执行这个程序让他访问http://www.yahoo.com.cn,然后让他把页下到本地.
2.要比较服务器上的文件时间和本地文件的时间,不相同的才下载.
3.还要实现断点续传的.
4.客户端每隔一段时间要比较一次和服务器上的文件时间,完全在没有人操作的情况下工作.
以上四点怎么实现请高手给点思路,有代码最好.
1.是在客户端执行这个程序让他访问http://www.yahoo.com.cn,然后让他把页下到本地.
2.要比较服务器上的文件时间和本地文件的时间,不相同的才下载.
3.还要实现断点续传的.
4.客户端每隔一段时间要比较一次和服务器上的文件时间,完全在没有人操作的情况下工作.
以上四点怎么实现请高手给点思路,有代码最好.
解决方案 »
- sax解析xml,xml文件的路径问题
- 访问串口的程序在jdk中运行正常,在eclipse中却不行
- 怎么用JAVA实现DES或AES算法???
- 如何用c语言来访问java的接口?
- LINUX下如何修改目录权限
- 关于字符串加密的疑问
- 新手求教
- java菜鸟求助!要求用java写一个程序读取两个.sql文件,然后能手动输入信息将.sql两个文件中指定内容替换,最后另存问修改后的同名文件
- 编了一个java浏览器程序,运行时 点NEXT按钮 出现IeEmbed.exe 内存不能为read错误 为什么呢??
- 我下了JB 企业版 不知如何安装?
- Java里面有没有像VC++里面的ListCtrl的类。
- Listener之间切换的问题
URLConnection
IO
Thread
先把这个实现也可以,别的慢慢说.
import java.io.*;public class Test { public static void main(String[] args) throws Exception {
URL url = new URL("http://www.yahoo.com.cn");
InputStream is = url.openStream();
InputStreamReader isr = new InputStreamReader(is); StringBuffer sb = new StringBuffer();
int ic = 0;
while ((ic = isr.read()) != -1) {
sb.append((char) ic);
}
isr.close(); System.out.println(sb.toString()); }}
import java.io.*;public class Test { public static void main(String[] args) throws Exception {
URL url = new URL("http://www.yahoo.com.cn"); InputStreamReader isr = new InputStreamReader(url.openStream()); StringBuffer sb = new StringBuffer();
int ic = 0;
while ((ic = isr.read()) != -1) {
sb.append((char) ic);
}
isr.close(); System.out.println(sb.toString()); FileOutputStream fos = new FileOutputStream("yahoo.html");
fos.write(sb.toString().getBytes());
fos.close();
}}=================================================to chrisl8080(cl) 有些问题应该自己先去想办法去解决的
你没有考虑断点续传
也就是说你只能读一部分
不信你式式
我读了http://localhost:8080/erp/new.rar
如果这个文件太大就直接报错了,小的话可以读,下载后在解压缩就解不开了.
> 先把这个实现也可以,别的慢慢说.客户端能写什么程序?你准备用 applet 还是 JavaScript?
InputStream isr = url.openStream();
int ic = 0;
FileOutputStream fos = new FileOutputStream("yahoo.html");
byte[] by = new byte[1024];
while (isr.read(by) != -1) {
sb.append((char) ic);
fos.write(by);
}
isr.close(); System.out.println(sb.toString());
fos.close();
Web服务器的时候要多加一条信息--从哪里开始。可以先检查已下载的文件大小,然后从该处以后的位置下载理论上可以这样实现
Good Luck :-)
import java.io.*;
import java.net.*;
public class SiteFileFetch extends Thread {
SiteInfoBean siteInfoBean = null; //文件信息Bean
long[] nStartPos; //开始位置
long[] nEndPos; //结束位置
FileSplitterFetch[] fileSplitterFetch; //子线程对象
long nFileLength; //文件长度
boolean bFirst = true; //是否第一次取文件
boolean bStop = false; //停止标志
File tmpFile; //文件下载的临时信息
DataOutputStream output; //输出到文件的输出流
//负责整个文件的抓取,控制内部线程(FileSplitterFetch类)
public SiteFileFetch(SiteInfoBean bean) throws IOException{
siteInfoBean = bean;
//tmpFile = File.createTempFile ("zhong","1111",new File(bean.getSFilePath()));
tmpFile = new File(bean.getSFilePath()+File.separator + bean.getSFileName()+".info");
if(tmpFile.exists ()){
bFirst = false;
read_nPos();//读取已下载的文件信息,断点续传
}else{
nStartPos = new long[bean.getNSplitter()];
nEndPos = new long[bean.getNSplitter()];
}
}
public void run(){
//获得文件长度
//分割文件
//实例FileSplitterFetch
//启动FileSplitterFetch线程
//等待子线程返回
try{
if(bFirst){
nFileLength = getFileSize();
if(nFileLength == -1){
System.err.println("File Length is not known!");
}else if(nFileLength == -2){
System.err.println("File is not access!");
}else{
for(int i=0;i< nStartPos.length;i++){
nStartPos[i] = (long)(i*(nFileLength/nStartPos.length));
}
for(int i=0;i< nEndPos.length-1;i++){
nEndPos[i] = nStartPos[i+1];
}
nEndPos[nEndPos.length-1] = nFileLength;
}
}
//启动子线程
fileSplitterFetch = new FileSplitterFetch[nStartPos.length];
for(int i=0;i< nStartPos.length;i++){
fileSplitterFetch[i] = new FileSplitterFetch(siteInfoBean.getSSiteURL(), siteInfoBean.getSFilePath() + File.separator + siteInfoBean.getSFileName(), nStartPos[i],nEndPos[i],i);
Utility.log("Thread " + i + " , nStartPos = " + nStartPos[i] + ", nEndPos = " + nEndPos[i]);
fileSplitterFetch[i].start();
}
// fileSplitterFetch[nPos.length-1] = new FileSplitterFetch(siteInfoBean.getSSiteURL(), siteInfoBean.getSFilePath() + File.separator + siteInfoBean.getSFileName(),nPos[nPos.length-1],nFileLength,nPos.length-1);
// Utility.log("Thread " + (nPos.length-1) + " , nStartPos = " + nPos[nPos.length-1] + ",nEndPos = " + nFileLength);
// fileSplitterFetch[nPos.length-1].start();
//等待子线程结束
//int count = 0;
//是否结束while循环
boolean breakWhile = false;
while(!bStop){
write_nPos();//记录每个线程的下载情况
Utility.sleep(500);
breakWhile = true;
for(int i=0;i< nStartPos.length;i++){
if(!fileSplitterFetch[i].bDownOver){
breakWhile = false;
break;
}
}
if(breakWhile)
break;
}
System.err.println("文件下载结束!");
}catch(Exception e){
e.printStackTrace ();
}
}
//获得文件长度
public long getFileSize(){
// System.out.println("Ok");
int nFileLength = -1;
try{
URL url = new URL(siteInfoBean.getSSiteURL());
HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection ();
httpConnection.setRequestProperty("User-Agent","NetFox");
int responseCode=httpConnection.getResponseCode();
if(responseCode>=400){
processErrorCode(responseCode);
return -2; //-2 represent access is error
}
String sHeader;
for(int i=1;;i++){
//DataInputStream in = new DataInputStream(httpConnection.getInputStream ());
//Utility.log(in.readLine());
sHeader=httpConnection.getHeaderFieldKey(i);
if(sHeader!=null){
if(sHeader.equals("Content-Length")){
nFileLength = Integer.parseInt(httpConnection.getHeaderField(sHeader));
//System.out.println("OK"+nFileLength);
break;
}
}else
break;
}
}catch(IOException e){e.printStackTrace ();
}catch(Exception e){e.printStackTrace ();}
Utility.log(nFileLength);
return nFileLength;
}
//保存下载信息(文件指针位置)
private void write_nPos(){
try{
output = new DataOutputStream(new FileOutputStream(tmpFile));
output.writeInt(nStartPos.length);
for(int i=0;i< nStartPos.length;i++){
//output.writeLong(nPos[i]);
output.writeLong(fileSplitterFetch[i].nStartPos);
output.writeLong(fileSplitterFetch[i].nEndPos);
}
output.close();
}catch(IOException e){e.printStackTrace ();}
catch(Exception e){e.printStackTrace ();}
}
//读取保存的下载信息(文件指针位置)
private void read_nPos(){
try{
DataInputStream input = new DataInputStream(new FileInputStream(tmpFile));
int nCount = input.readInt();
nStartPos = new long[nCount];
nEndPos = new long[nCount];
for(int i=0;i< nStartPos.length;i++){
nStartPos[i] = input.readLong();
nEndPos[i] = input.readLong();
}
input.close();
}catch(IOException e){e.printStackTrace ();}
catch(Exception e){e.printStackTrace ();}
}
private void processErrorCode(int nErrorCode)
{
System.err.println("Error Code : " + nErrorCode);
}
//停止文件下载
public void siteStop(){
bStop = true;
for(int i=0;i< nStartPos.length;i++)
fileSplitterFetch[i].splitterStop();
}
}
为什么要比较时间,即使时间不同,文件内容也有可能相同。
建议你比较文件内容,为了容易比较,在下载后,应该得到每个文件的md5码,并保存到一个数据库table中,md5码为该文件的version,如果version不同才下载
可参考
下载后的文件你是能计算出 MD5,但是,下次决定是否下载的时候,你怎么知道服务器上那个文件的 MD5 呢?我的前提是有一个table保存filename和md5码,