⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sitefilefetch.java

📁 java网络编程 包含全书所有代码编程以及实例
💻 JAVA
字号:
package download;import java.io.*;import java.net.*;/** * Title:        Java实现网络文件传输 * Description:  在客户端请求Web服务器传输指定文件,并将文件保存。 * Copyright:    Copyright (c) 2002 * Company: * @author 钟华 * @version 1.0 */public class SiteFileFetch extends Thread {   // 传输文件线程类  SiteInfoBean siteInfoBean = null; //文件信息Bean  long[] nPos;  long[] nStartPos; //开始位置  long[] nEndPos; //结束位置  FileSplitterFetch[] fileSplitterFetch; //子线程对象  long nFileLength; //文件长度  boolean bFirst = true; //是否第一次取文件  boolean bStop = false; //停止标志  File tmpFile; //文件传输临时信息  DataOutputStream output; //输出到文件的输出流  public SiteFileFetch(SiteInfoBean bean) throws IOException{    siteInfoBean = bean;    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();      }      //等待子线程结束      //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.out.println("文件传输结束!");    }    catch(Exception e){      e.printStackTrace ();    }  }  //获得文件长度  public long getFileSize(){    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 为Web服务器响应错误      }      String sHeader;      for(int i=1;;i++){        sHeader=httpConnection.getHeaderFieldKey(i);        if(sHeader!=null){          if(sHeader.equals("Content-Length")){            nFileLength = Integer.parseInt(httpConnection.getHeaderField(sHeader));            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();  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -