`

ftp上传下载和zip压缩解压操作

阅读更多
package com.test.action;

import java.io.BufferedInputStream;
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 sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;



public class FtpZipOption {
	
	/**
	 * 从ftp服务器下载zip文件
	 * @param 
	 *@throws Exception
	 **/
	public static void downLoadZipFile() throws Exception {

		

        String wantFileName = getWantFileName() ;//得到此时该下载的文件名
        String[] localFileNameArray = getLocalFileNameArray("D:\\download") ;//得到所有已经下载的文件名
        
        if(ifToDownLoadFile(wantFileName,localFileNameArray)){//判断是否需要下载
        	
        	String str; //输出信息字符串
    		/**   
    		 * 和服务器建立连接   
    		 */
    		FtpClient ftp = new FtpClient("192.168.39.189"); //根据服务器ip建立连接                          
    		str = ftp.getResponseString(); //获得响应信息
    		System.out.println("连接服务器:" + str);
    		/**   
    		 * 登陆到Ftp服务器   
    		 */
    		ftp.login("test", "test"); //根据用户名和密码登录服务器
    		str = ftp.getResponseString();
    		System.out.println("登录:"+str);
        	/**   
    		 * 打开并定位到服务器目录   
    		 */
    		ftp.cd("downziptest\\downzip"); //打开服务器上的文件目录
    		str = ftp.getResponseString() ;
    		System.out.println("打开服务器目录:"+str) ;
    		ftp.binary();//转化为二进制的文件
    		TelnetInputStream ftpIn = ftp.get(wantFileName+".zip");//找到要读取的文件
    		byte[] buf = new byte[204800];
    		int bufsize = 0;
    		String toLocalPath = "D:\\download\\"+wantFileName+".zip" ;
    		FileOutputStream ftpOut = new FileOutputStream(toLocalPath);
    		while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
    			ftpOut.write(buf, 0, bufsize);
    		}
    		ftpOut.close();
    		ftpIn.close();
    		System.out.println("下载"+wantFileName+".zip完成!") ;
        	
        }else{
        	System.out.println(wantFileName+".zip在本地已经存在,不予下载") ;
        }
		
	}
   //	上传文件;并返回上传文件的信息
	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[i].isFile())
				ret.add(tmp[i]);
			if (tmp[i].isDirectory())
				ret.addAll(getSubFiles(tmp[i]));
		}
		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[i]);
			}
		}
		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 该路径下所有文件名
	 * **/
	private static String[] getLocalFileNameArray(String localPath){
		File diskFile = new File(localPath);
		if(diskFile!=null){
			String[] fileNameList = diskFile.list() ;
			return fileNameList ;
		}else{
			return null ;
		}
	}
	
	/**
	 *获得当前系统时间 
	 */
	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[i].equals(wantFileName+".zip")){
							return false ;
						}
					}
					return true ;
				}else{
					return true ;
				}
			}else{
				return false ;
			}
	}
	public static void main(String args[]){
		try {
			FtpZipOption.downLoadZipFile() ;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
 
分享到:
评论
1 楼 kong_bai 2009-02-24  
不错,很好用,有没想过实现断点续传?

相关推荐

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

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

    C# 如何实现FTP的上传和下载.zip

    本教程将深入讲解如何使用C#实现FTP的上传和下载功能。 首先,我们需要了解C#中的`System.Net.FtpClient`命名空间,它包含了处理FTP连接和文件传输的类。`FtpWebRequest`和`FtpWebResponse`是主要的类,用于创建FTP...

    C#实现FTP操作和Zip压缩操作

    实现浏览本地文件,本地文件的压缩和解压缩,本地文件单个和批量上传到服务器,并且可以选择上传到FTP服务器的目的目录,FTP服务器文件分级浏览,ftp服务器上文件单个和批量下载到本地指定目录,FTP服务器上新建...

    java ftp 上传 下载 rar 压缩 解压

    在IT行业中,Java FTP上传、下载以及RAR压缩与解压是常见的操作,这些功能在文件管理系统、数据迁移、备份恢复等场景中广泛应用。本篇将详细介绍如何使用Java实现FTP(File Transfer Protocol)传输以及RAR文件的...

    FTP,SFTP文件上传,下载到服务器,ZIP文件压缩,加密,解密,然后再上传到服务器,各种封装操作;

    这里我们详细探讨一下"FTP,SFTP文件上传,下载到服务器,ZIP文件压缩,加密,解密,然后再上传到服务器"这一主题。 首先,FTP(File Transfer Protocol)是一种标准网络协议,用于在Internet上进行文件传输。它允许...

    FTP文件上传下载CSV文件生成ZIP压缩

    可以使用JUnit或其他测试框架,编写单元测试或集成测试,确保文件上传下载和CSV操作的正确性。 FileZipUtils.java则涉及到了文件的压缩与解压。在Java中,我们可以利用java.util.zip包中的ZipOutputStream和...

    ZIP文件解压上传服务器

    本场景涉及的是使用Java处理ZIP文件,解压后并将解压的文件上传至服务器。以下是对这一过程的详细阐述: 首先,我们需要理解`ZIP`文件格式。ZIP是一种常用的文件压缩格式,它能将多个文件或目录打包成一个单一的...

    ftp在线解压与压缩程序

    FTP在线解压功能意味着用户可以上传一个压缩文件(如ZIP、RAR或TAR格式)到FTP服务器,然后该程序会解析并解压缩文件,将其内容直接存放在服务器上。这样,用户无需下载整个压缩文件,节省了带宽和时间。解压缩过程...

    ftp空间上传rar文件解压 程序

    FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的标准协议,广泛应用于网站的文件上传与下载。在这个场景中,我们讨论的是如何通过FTP将RAR文件上传到远程服务器,并在服务器上进行解压操作。RAR是一...

    在线压缩 在线解压 FTP

    这种服务通常使用各种压缩算法(如ZIP、RAR等)将大文件减小,便于上传、下载和存储。在线压缩的优势在于便捷性,尤其对于那些不希望在本地计算机安装压缩软件或处理大文件时节省硬盘空间的用户来说非常实用。 2. *...

    使用Java向服务器上传文件压缩包并实现解压缩

    总的来说,Java结合JSch库可以方便地实现与SFTP服务器的交互,包括上传文件压缩包、解压缩、创建目录等操作。这些功能在分布式系统、云存储和自动化运维场景中都十分常见。通过熟练掌握这些技能,开发人员能够构建...

    WebFTP(支持ZIP在线解压) v3.6.2.rar

    文件:剪切、复制、粘贴、删除、压缩(ZIP解压、预览)、打包下载、权限设置、代码编辑(支持15种语言语法高亮)... 其他:图片预览、列表视图风格切换、文件列表排序、常用快捷键支持、批量文件上传... 使用说明 ...

    主机空间ZIP文件解压.rar

    ZIP文件是一种常见的文件压缩格式,它允许用户将多个文件和文件夹打包成一个单一的压缩文件,以便于传输、存储和管理。本文将详细讨论如何在主机空间中对ZIP文件进行解压操作,以及相关的知识点。 首先,我们需要...

    c#常用类库源码excel导入导出的Json类库条码类库加密解密ftp上传图片上传压缩解压汉子内码缓存等.zip

    c#常用类库大全源码,有excel导入导出的,Json类库,条码类库,加密解密,ftp上传,图片上传,压缩解压,汉子内码,缓存等。 BarCodeToHTML.cs CacheHelper.cs Captcha.cs CNDate.cs ConvertJson.cs CsvHelper.cs ...

    FTP 在线解压工具

    FTP在线解压工具的工作原理通常是这样的:首先,用户通过FTP客户端将ZIP、RAR或其他类型的压缩文件上传到服务器。FTP客户端提供了图形化的界面,使得文件传输变得直观且易于操作。用户输入FTP服务器的地址、用户名和...

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

    这个库提供了丰富的FTP操作API,包括连接、登录、文件上传和下载等。 1. **导入Apache Commons Net库**: 在项目中添加Apache Commons Net依赖,如果使用Maven,可以在pom.xml文件中添加以下依赖: ```xml ...

    FTP-springboot.zip

    在这里,我们将使用`FtpSessionFactory`和`DefaultFtpSessionFactory`来建立FTP会话,并使用`FtpTemplate`来进行实际的文件操作,如上传和下载。 ```java @Configuration public class FtpConfig { @Value("${...

    FTP自动下载解压实例

    总的来说,这个实例涉及了FTP连接、XML配置文件的读取、INI文件的解析以及文件的下载和解压。开发者需要了解.NET框架的相关类库,并具备处理网络请求和文件操作的基本知识。通过这样的实现,我们可以创建一个自动化...

    FTP上传及解压压缩包问题

    在实际应用中,完成本地文件的压缩解压后,可以通过上述提到的FTP客户端库将文件上传至远程服务器。 #### 四、总结 通过Java标准库提供的`java.util.zip`包,我们能够高效地处理ZIP文件的压缩与解压工作。结合FTP...

    java写的ftp下载上传定时监控

    Java作为多平台支持的编程语言,提供了丰富的库和工具来实现FTP功能,包括下载、上传文件以及定时监控等操作。本篇文章将深入探讨如何使用Java进行FTP文件传输,并涉及自动解压和压缩的功能。 首先,让我们关注Java...

Global site tag (gtag.js) - Google Analytics