要求是有一个方法输入两个参数一个是http://www.yahoo.com.cn另一个是把这个文件存到哪里
1.是在客户端执行这个程序让他访问http://www.yahoo.com.cn,然后让他把页下到本地.
2.要比较服务器上的文件时间和本地文件的时间,不相同的才下载.
3.还要实现断点续传的.
4.客户端每隔一段时间要比较一次和服务器上的文件时间,完全在没有人操作的情况下工作.
以上四点怎么实现请高手给点思路,有代码最好.

解决方案 »

  1.   

    URL
    URLConnection
    IO
    Thread
      

  2.   

    1.是在客户端执行这个程序让他访问http://www.yahoo.com.cn,然后让他把页下到本地.
    先把这个实现也可以,别的慢慢说.
      

  3.   

    import java.net.*;
    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()); }}
      

  4.   

    请问dreamover(梦醒了)输出到某个文件怎么写.
      

  5.   

    新建一个URL然后获得一个stream然后读取就OK了
      

  6.   

    import java.net.*;
    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) 有些问题应该自己先去想办法去解决的
      

  7.   

    dreamover你做得不对
    你没有考虑断点续传
    也就是说你只能读一部分
    不信你式式
      

  8.   

    好象是
    我读了http://localhost:8080/erp/new.rar
    如果这个文件太大就直接报错了,小的话可以读,下载后在解压缩就解不开了.
      

  9.   

    晕,读压缩文件当然会有错,InputStreamReader是用来读文本型文件的,读二进制文件用InputStream!
      

  10.   

    > 1.是在客户端执行这个程序让他访问http://www.yahoo.com.cn,然后让他把页下到本地.
    > 先把这个实现也可以,别的慢慢说.客户端能写什么程序?你准备用 applet 还是 JavaScript?
      

  11.   

    InputStream isr = new InputStream(url.openStream());不对吧
      

  12.   

    客户端就是运行的一个类就可以,APPLET可以自己运行吗
      

  13.   

    这样改改可用,但是里面的脚本,样式表都拿不到。
    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();
      

  14.   

    以前写下载工具时看过一点断点续传的思想在客户端浏览器传给
    Web服务器的时候要多加一条信息--从哪里开始。可以先检查已下载的文件大小,然后从该处以后的位置下载理论上可以这样实现
    Good Luck :-)
      

  15.   

    只有第3个有难度,其他的so easy
      

  16.   

    解决1,3问题,2,4请朋友们帮忙,本人不会了
    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();
     
     
      }
    }
      

  17.   

    //负责部分文件的抓取 **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(); } } 
      

  18.   

    关于2,4
    为什么要比较时间,即使时间不同,文件内容也有可能相同。
    建议你比较文件内容,为了容易比较,在下载后,应该得到每个文件的md5码,并保存到一个数据库table中,md5码为该文件的version,如果version不同才下载
    可参考
      

  19.   

    TO lcllcl987:下载后的文件你是能计算出 MD5,但是,下次决定是否下载的时候,你怎么知道服务器上那个文件的 MD5 呢?> 2.要比较服务器上的文件时间和本地文件的时间,不相同的才下载.在 HTTP Request 的 Header 里加上下面的内容    If-Modified-Since: Sun, 05 Feb 2006 03:14:56 GMT服务器就会替你判断时间,如果需要重新下载,你会得到一个【200 OK】的 response,如果不需要重新下载,你会得到一个【304 Not Modified】的 response。
      

  20.   

    HTTP Request 的 Header 里怎么加能给个代码吗?
      

  21.   

    > HTTP Request 的 Header 里怎么加能给个代码吗?啊?!这个也要问哪?你的“断点续传”不是解决了吗?不是在 header 里加个“Range”吗?这个一样啊!
      

  22.   

    maquan('ma:kju):
    下载后的文件你是能计算出 MD5,但是,下次决定是否下载的时候,你怎么知道服务器上那个文件的 MD5 呢?我的前提是有一个table保存filename和md5码,
      

  23.   

    TO:FALCON那个断点继传的程序好想有点问题,在运行的时候如果强行结束程序,在重新下载的时候,程序不能正常技术.但是文件还是下完了,请问怎么该.