`

【转】java如何从ftp下载超大文件

    博客分类:
  • JAVA
 
阅读更多
转至: http://www.2cto.com/kf/201206/135869.html

package downloadMap;
 
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import javax.swing.JOptionPane;
import javax.swing.ProgressMonitorInputStream;
import TIp.Jframet;
import doFile.ZipToFile;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
public class FtpZipOption {
/**
  *
  * 从ftp服务器下载zip文件
  *
  * @param
  *
  *@throws Exception
  **/
public static void downLoadZipFile(String wantFileName ) throws Exception {
/*new Thread(){
  public void run(){
   Jframet jf = new Jframet("正在链接ftp,qing'shao'h", "确定");
   jf.jb.setVisible(false);
  }
}.start();*/
  String[] localFileNameArray = getLocalFileNameArray("c:\\BaseMap");// 得到所有已经下载的tb文件名
  File downFile=new File("c:\\BaseMap");
  if(!downFile.exists()) downFile.mkdir();
 
  if (ifToDownLoadFile(wantFileName, localFileNameArray)) {// 判断是否需要下载
   String str; // 输出信息字符串
   /**
    *
    * 和服务器建立连接
    */
   FtpClient ftp = new FtpClient("172.18.2.66"); // 根据服务器ip建立连接
  
   //JOptionPane.showMessageDialog(null, "");
   str = ftp.getResponseString(); // 获得响应信息
   System.out.println("连接服务器:" + str);
  
   /**
    *
    * 登陆到Ftp服务器
    */
   ftp.login("admin", "1"); // 根据用户名和密码登录服务器
   str = ftp.getResponseString();
   System.out.println("登录:" + str);
  
   
   /**
    *
    * 打开并定位到服务器目录
    */
   ftp.cd("mapdata2"); // 打开服务器上的文件目录
   str = ftp.getResponseString();
   System.out.println("打开服务器目录:" + str);
   ftp.binary();// 转化为二进制的文件
   TelnetInputStream ftpIn = ftp.get(wantFileName + ".zip");// 找到要读取的文件
  
   /*Jframet jf=new Jframet("正在下载地图,请稍候...","确定");
   jf.jb.setVisible(false);*/
   long fileLength=FtpZipOption.getFileSize("wantFileName.zip");
   System.out.println(fileLength);
   byte[] buf = new byte[204800];
   int bufsize = 0;
   File f=new File("c:\\BaseMap");
   if(!f.exists()) f.mkdirs();
   String toLocalPath = "c:\\BaseMap\\" + wantFileName + ".zip";
   /*File f=new File(toLocalPath);
   f.mkdirs();*/
   FileOutputStream ftpOut = new FileOutputStream(toLocalPath);
   int readLine=0;
   while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
    //System.out.println(bufsize);
    ftpOut.write(buf, 0, bufsize);
    readLine=+bufsize;
   
   }
   System.out.println(readLine);
   ftpOut.close();
   ftpIn.close();
   ZipToFile ziptofile=new ZipToFile();
  
         String  PostFilePath = "c:\\BaseMap";  
          ziptofile.zipToFile(toLocalPath, PostFilePath);
  // JOptionPane.showMessageDialog(null, "下载" + wantFileName + ".zip完成!");
   System.out.println("下载" + wantFileName + ".zip完成!");
  /* jf.jl.setText("下载地图成功");
   jf.jb.setVisible(true);*/
  } else {
  
  }
}
public static long getFileSize(String filename) throws IOException {
  String str; // 输出信息字符串
  /**
   *
   * 和服务器建立连接
   */
  FtpClient ftp = new FtpClient("172.18.2.66"); // 根据服务器ip建立连接
  str = ftp.getResponseString(); // 获得响应信息
  System.out.println("连接服务器:" + str);
  /**
   *
   * 登陆到Ftp服务器
   */
  ftp.login("admin", "1"); // 根据用户名和密码登录服务器
  str = ftp.getResponseString();
  System.out.println("登录:" + str);
  /**
   *
   * 打开并定位到服务器目录
   */
  ftp.cd("mapdata2"); // 打开服务器上的文件目录
  str = ftp.getResponseString();
  System.out.println("打开服务器目录:" + str);
  ftp.binary();// 转化为二进制的文件
  long fileSize = -1;
  String s = "SIZE " + filename + "\r\n";
  ftp.sendServer(s);
  try {
  int status = ftp.readServerResponse();
  if (status == 213) {
  String msg = ftp.getResponseString();
  fileSize = Long.parseLong(msg.substring(3).trim());
  }
  } catch (IOException e) {
  e.printStackTrace();
  }
  return fileSize;
  }
// 上传文件;并返回上传文件的信息
/*private static String upLoadZipToServer(String filename) throws Exception {
  String str; // 输出信息字符串
  String timeStr = getNowTime();// 获得当前时间
  String recordStr = "上传时间:" + timeStr + "\r\n";// 信息记录字符串
  *//**
   *
   * 和服务器建立连接
   *//*
  FtpClient ftp = new FtpClient("192.168.39.189"); // 根据服务器ip建立连接
  str = ftp.getResponseString(); // 获得响应信息
  System.out.println(str);
  recordStr += "连接服务器:" + str + "\r\n";
  *//**
   *
   * 登陆到Ftp服务器
   *//*
  ftp.login("test", "test"); // 根据用户名和密码登录服务器
  str = ftp.getResponseString();
  System.out.println(str);
  recordStr += "登录:" + str + "\r\n";
  *//**
   *
   * 打开并定位到test目录
   *//*
  ftp.cd("uptest"); // 打开服务器上的test文件夹
  ftp.binary();// 转化为二进制的文件
  str = ftp.getResponseString();
  System.out.println(str);
  FileInputStream is = null;
  TelnetOutputStream os = null;
  try {
   // "upftpfile"用ftp上传后的新文件名
   os = ftp.put("uptest.zip");
   File file_in = new java.io.File(filename);
   if (file_in.length() == 0) {
    return "上传文件为空!";
   }
   is = new FileInputStream(file_in);
   byte[] bytes = new byte[1024];
   int c;
   while ((c = is.read(bytes)) != -1) {
    os.write(bytes, 0, c);
   }
  } finally {
   if (is != null) {
    is.close();
   }
   if (os != null) {
    os.close();
   }
  }
  return "上传文件成功!";
}*/
/**
  *
  * zip压缩功能,压缩sourceFile(文件夹目录)下所有文件,包括子目录
  *
  * @param sourceFile
  *            ,待压缩目录; toFolerName,压缩完毕生成的目录
  *
  * @throws Exception
  */
/*public static void fileToZip(String sourceFile, String toFolerName)
   throws Exception {
  List fileList = getSubFiles(new File(sourceFile)); // 得到待压缩的文件夹的所有内容
  ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
  toFolerName));
  ZipEntry ze = null;
  byte[] buf = new byte[1024];
  int readLen = 0;
  for (int i = 0; i < fileList.size(); i++) { // 遍历要压缩的所有子文件
   File file = (File) fileList.get(i);
   System.out.println("压缩到的文件名:" + file.getName());
   ze = new ZipEntry(getAbsFileName(sourceFile, file));
   ze.setSize(file.length());
   ze.setTime(file.lastModified());
   zos.putNextEntry(ze);
   InputStream is = new BufferedInputStream(new FileInputStream(file));
   while ((readLen = is.read(buf, 0, 1024)) != -1) {
    zos.write(buf, 0, readLen);
   }
   is.close();
  }
  zos.close();
  System.out.println("压缩完成!");
}
*//**
  *
  * 解压zip文件
  *
  * @param sourceFile
  *            ,待解压的zip文件; toFolder,解压后的存放路径
  *
  * @throws Exception
  **//*
public static void zipToFile(String sourceFile, String toFolder)
   throws Exception {
  String toDisk = toFolder;// 接收解压后的存放路径
  ZipFile zfile = new ZipFile(sourceFile);// 连接待解压文件
  System.out.println("要解压的文件是:" + zfile.getName());
  Enumeration zList = zfile.entries();// 得到zip包里的所有元素
  ZipEntry ze = null;
  byte[] buf = new byte[1024];
  while (zList.hasMoreElements()) {
   ze = (ZipEntry) zList.nextElement();
   if (ze.isDirectory()) {
    System.out.println("打开zip文件里的文件夹:" + ze.getName()
    + " skipped...");
    continue;
   }
   System.out.println("zip包里的文件: " + ze.getName() + "\t" + "大小为:"
   + ze.getSize() + "KB");
   // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
   OutputStream outputStream = new BufferedOutputStream(
   new FileOutputStream(getRealFileName(toDisk, ze.getName())));
   InputStream inputStream = new BufferedInputStream(zfile
   .getInputStream(ze));
   int readLen = 0;
   while ((readLen = inputStream.read(buf, 0, 1024)) != -1) {
    outputStream.write(buf, 0, readLen);
   }
   inputStream.close();
   outputStream.close();
   System.out.println("已经解压出:" + ze.getName());
  }
  zfile.close();
}
*//**
  *
  * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
  *
  * @param baseDir
  *            java.lang.String 根目录
  *
  * @param realFileName
  *            java.io.File 实际的文件名
  *
  * @return 相对文件名
  *//*
private static String getAbsFileName(String baseDir, File realFileName) {
  File real = realFileName;
  File base = new File(baseDir);
  String ret = real.getName();
  while (true) {
   real = real.getParentFile();
   if (real == null)
    break;
   if (real.equals(base))
    break;
   else
    ret = real.getName() + "/" + ret;
  }
  return ret;
}
*//**
  *
  * 取得指定目录下的所有文件列表,包括子目录.
  *
  * @param baseDir
  *            File 指定的目录
  *
  * @return 包含java.io.File的List
  *//*
private static List<File> getSubFiles(File baseDir) {
  List<File> ret = new ArrayList<File>();
  File[] tmp = baseDir.listFiles();
  for (int i = 0; i < tmp.length; i++) {
   if (tmp.isFile())
    ret.add(tmp);
   if (tmp.isDirectory())
    ret.addAll(getSubFiles(tmp));
  }
  return ret;
}
*//**
  *
  * 给定根目录,返回一个相对路径所对应的实际文件名.
  *
  * @param zippath
  *            指定根目录
  *
  * @param absFileName
  *            相对路径名,来自于ZipEntry中的name
  *
  * @return java.io.File 实际的文件
  *//*
private static File getRealFileName(String zippath, String absFileName) {
  String[] dirs = absFileName.split("/", absFileName.length());
  File ret = new File(zippath);// 创建文件对象
  if (dirs.length > 1) {
   for (int i = 0; i < dirs.length - 1; i++) {
    ret = new File(ret, dirs);
   }
  }
  if (!ret.exists()) {// 检测文件是否存在
   ret.mkdirs();// 创建此抽象路径名指定的目录
  }
  ret = new File(ret, dirs[dirs.length - 1]);// 根据ret 抽象路径名和child
             // 路径名字符串创建一个新File 实例
  return ret;
}
*/
/**
  *
  * 取得ftp服务器上某个目录下的所有文件名
  *
  * @param ftp
  *            , FtpClient类实例; folderName,服务器的文件夹名
  *
  * @throws Exception
  *
  * @return list 某目录下文件名列表
  **/
private static List getServerFileNameList(FtpClient ftp, String folderName)
   throws Exception {
  BufferedReader dr = new BufferedReader(new InputStreamReader(ftp
    .nameList(folderName)));
  List<String> list = new ArrayList<String>();
  String s;
  while ((s = dr.readLine()) != null) {
   list.add(s);
  }
  return list;
}
/**
  *
  * 得到已经下载的目录下的所有文件名的数组
  *
  * @param localPath
  *            本地的下载文件保存路径
  *
  * @return 该路径下所有tb文件名
  *
  * **/
private static String[] getLocalFileNameArray(String localPath) {
  File diskFile = new File(localPath);
  if (diskFile != null) {
   String[] fileNameList = diskFile.list();
   return fileNameList;
  } else {
   return null;
  }
}
/**
  *
  *获得当前系统时间 www.2cto.com
  */
/*public static String getNowTime() {
  String timeStr;
  DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
  Date currentTime = new Date(System.currentTimeMillis());
  timeStr = format.format(currentTime);
  return timeStr;
}
public static String getWantFileName() throws Exception {
  *//** 得到当前的系统精确时间**//*
  Date currentTime = new Date(System.currentTimeMillis());
  *//** 接下来得到系统当前的年月日**//*
  DateFormat df1 = new SimpleDateFormat("yyyyMMdd");
  Date todayDate = new Date(System.currentTimeMillis());
  String todayStr = df1.format(todayDate);// 得到当前的年月日
  *//** 接下来得到四个比较时间的String类型;分别在00点,06点,12点和18点**//*
  String compareTimeStr1 = todayStr + "00";
  String compareTimeStr2 = todayStr + "06";
  String compareTimeStr3 = todayStr + "12";
  String compareTimeStr4 = todayStr + "18";
  *//** 接下来得到四个比较时间的date类型**//*
  DateFormat df2 = new SimpleDateFormat("yyyyMMddHH");
  Date compareTime1 = df2.parse(compareTimeStr1);
  Date compareTime2 = df2.parse(compareTimeStr2);
  Date compareTime3 = df2.parse(compareTimeStr3);
  Date compareTime4 = df2.parse(compareTimeStr4);
  *//** 接下来由当前系统时间和四个参照时间进行比较,找出该下载的文件名**//*
  if (currentTime.after(compareTime1) && currentTime.before(compareTime2)) {
   // 此时应该下载00点的文件,文件名为:compareTimeStr1
   System.out.println("此时要下载的文件名为:" + compareTimeStr1 + ".zip");
   return compareTimeStr1;
  } else if (currentTime.after(compareTime2)
    && currentTime.before(compareTime3)) {
   // 此时应该下载06点的文件,文件名为:compareTimeStr2
   System.out.println("此时要下载的文件名为:" + compareTimeStr2 + ".zip");
   return compareTimeStr2;
  } else if (currentTime.after(compareTime3)
    && currentTime.before(compareTime4)) {
   // 此时应该下载12点的文件,文件名为:compareTimeStr3
   System.out.println("此时要下载的文件名为:" + compareTimeStr3 + ".zip");
   return compareTimeStr3;
  } else if (currentTime.after(compareTime4)) {
   // 此时应该下载18点的文件,文件名为:compareTimeStr4
   System.out.println("此时要下载的文件名为:" + compareTimeStr4 + ".zip");
   return compareTimeStr4;
  } else {
   // nothing to do
   return null;
  }
}
*/
/**
  *
  * 判断此时是否需要下载文件
  *
  * @param wantFileName
  *            ,此时该下载的文件名; localFileNameArray ,本地已经有的文件名
  *
  * @return ture--需要下载; false--本地已经有了,不需要下载
  *
  * **/
public static boolean ifToDownLoadFile(String wantFileName,
   String[] localFileNameArray) {
  if (wantFileName == null && localFileNameArray == null) {// 当想要下载的文件名获得失败
   return false;
  } else if (wantFileName == null && localFileNameArray != null) {// 当想要下载的文件名获得失败
   return false;
  } else if (wantFileName != null && localFileNameArray == null) {// 当本地没有已下载的文件
   return true;
  } else if (wantFileName != null && localFileNameArray != null) {// 当要下载的文件在本地还没有
   if (localFileNameArray.length > 0) {
    for (int i = 0; i < localFileNameArray.length; i++) {
     if (localFileNameArray.equals(wantFileName + ".zip")) {
      return false;
     }
    }
    return true;
   } else {
    return true;
   }
  } else {
   return false;
  }
}
public static void main(String args[]) {
  try {
   long aa=FtpZipOption.getFileSize("2.zip");
   System.out.println(aa);
   FtpZipOption.downLoadZipFile("2");
  
  } catch (Exception e) {
   e.printStackTrace();
  }
}
}
分享到:
评论

相关推荐

    java实现Ftp批量下载文件及解压

    如果需要从FTP服务器的特定目录下载文件,可以使用`changeWorkingDirectory()`方法。 ```java ftp.changeWorkingDirectory("/path/to/directory"); ``` 4. **列出目录中的文件**: 使用`listNames()`或`list...

    Java解析FTP服务器文本文件

    2. 文件下载:使用retrieveFile方法,从服务器上下载文件到本地目录。 3. 编码格式转换:因为FTP服务器上默认的编码方式为iso-8859-1,而本地操作系统的目录名和文件名默认的编码方式为GBK。因此,我们需要进行编码...

    Java实现FTP批量大文件上传下载

    让我们设想这样一个情形--我们想写一个纯 Java 的从一个远程计算机上运行的 FTP 服务器上传下载文件的应用程序;我们还希望能够得到那些供下载的远程文件的基本文件信息,如文件名、数据或者文件大小等。尽管从头...

    java 从ftp服务器下载文件

    * Description: FTP文件下载功能 * @Version 1.0 Jul 27, 2008 5:32:36 PM by cuihongbao@d-heaven.com * @param url FTP服务器地址 * @param port FTP服务器端口号 * @param username FTP用户名 * @param ...

    Java上传下载ftp上的文件

    本文将深入探讨如何使用Java实现FTP文件的上传和下载功能,以满足标题和描述中的需求。作者宋海康提供的案例将为我们提供一个基础,帮助我们理解这个过程。 首先,我们需要导入Java FTP库,通常是`commons-net`库,...

    Java实现FTP文件上传和下载

    以下将详细介绍如何使用Java实现FTP文件上传和下载的步骤,以及涉及到的关键知识点。 首先,Java通过`java.net`和`javax.net`包提供了FTP功能,但这些原生API并不易用。因此,大多数开发人员会使用第三方库如Apache...

    Java实现FTP批量大文件上传下载.pdf

    Java实现FTP批量大文件上传下载 一、Java FTP客户端库的选择 在选择Java FTP客户端库时,需要考虑多个因素,例如性能、安全性、可靠性等。当前有多种FTP客户端库可供选择,例如J-FTP、SimpleFTP、FTPClient等。每...

    Java FTP 指定下载文件和上传文件到指定的服务器目录

    4. **下载文件**:调用`retrieveFile`方法完成文件下载操作。 #### 四、注意事项 1. **权限问题**:确保登录的FTP账户具有相应的读写权限。 2. **异常处理**:在实际开发中,应更加细致地处理异常情况,比如重试...

    JAVA获取FTP文件列表

    ### JAVA获取FTP文件列表知识点详解 #### 一、概述 在现代软件开发中,FTP(File Transfer Protocol)是一种广泛使用的协议,用于在网络上进行文件传输。本文档将详细介绍一个基于Java的实用工具类`FtpClientUtil`...

    java从ftp上传下载文件

    Java操作FTP和SFTP下载与上传文件是网络编程中常见的任务,主要涉及到远程文件系统的访问。FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的标准协议,而SFTP(Secure File Transfer Protocol)则是...

    java编写的ftp文件实时监控下载上传

    用java语言编写的ftp小工具,可以按指定时间监控ftp服务器,把服务器指定目录内新产生的文件或者文件夹下载到本地指定文件夹,下载后删除数据。 也可以监控本地文件夹,把文件夹内新产生的文件或者文件夹整体上传到...

    java 读取FTP服务器文件

    以下是一份详细的Java FTP文件读取教程,涵盖了相关的重要知识点。 1. **FTP库的选择**: Java标准库中并没有内置FTP客户端,因此我们需要引入第三方库,如Apache Commons Net库。这个库提供了丰富的FTP功能,包括...

    java从FTP服务器上下载pdf

    实现从FTP服务器下载PDF,标有注释。

    java SSH FTP下载文件

    6. **文件下载**:使用SFTP通道的`get()`方法从远程服务器下载文件到本地。 ```java sftpChannel.cd("/remote/path"); // 进入远程目录 sftpChannel.get("filename", "/local/path/filename"); // 下载文件 ``` 7....

    java ftp上传 下载 文件压缩解压

    这篇博客“java ftp上传 下载 文件压缩解压”很可能是关于如何使用Java实现FTP文件上传、下载以及文件的压缩与解压功能。下面我们将深入探讨这些知识点。 首先,FTP上传和下载是Java中常见的任务,通常通过`java...

    java 读取Ftp指定位置的文件解析并入库

    标题 "java 读取Ftp指定位置的文件解析并入库" 涉及到的是使用Java编程语言通过FTP(File Transfer Protocol)协议从远程服务器上下载文件,然后对下载的文件进行解析,并将解析得到的数据存储到数据库中。...

    java定时从ftp服务器更新相关文件

    要实现定时从FTP服务器下载文件,可以利用Java的定时框架,如`java.util.Timer`或`java.concurrent.ScheduledExecutorService`。设置定时任务,周期性检查FTP服务器是否有新文件。 下面是一个使用`ftp4j`实现的...

    用Java实现FTP批量大文件上传下载

    【Java实现FTP批量大文件上传下载详解】 在Java中实现FTP批量大文件的上传和下载,需要借助于现有的FTP客户端库。本篇文章将探讨如何利用Java编写FTP客户端代码,将其封装为Applet控件,以满足Web上的批量、大文件...

    java 连接 FTP 文件操作(上传,下载,删除,复制

    **文件下载** 下载文件则是通过`retrieveFile`方法,同样需要提供远程文件路径和一个本地文件流来接收数据。 ```java OutputStream fos = new FileOutputStream("localSavePath"); ftpClient.retrieveFile(...

    java下载ftp文件.txt

    ### Java下载FTP文件 在实际应用开发中,经常需要与FTP服务器进行交互,比如上传文件、下载文件等操作。Java提供了一套强大的工具和API来实现这些功能。下面我们将通过一个具体的示例来了解如何用Java实现从FTP...

Global site tag (gtag.js) - Google Analytics