之前写的有bug啊 每人说..

依赖

<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.4</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.3.2</version></dependency><dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.5</version></dependency>

可选择多个路径进行压缩

依赖

<dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.5</version>
</dependency>

可选择多个路径进行压缩

依赖

<dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.5</version>
</dependency>

可选择多个路径进行压缩

package per.qiao.utils.ftp;import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.io.IOException;
import java.io.InputStream;/*** Create by IntelliJ Idea 2018.2** @author: qyp* Date: 2019-07-19 17:10*/
public class FtpFileZipUtls {private final static Logger logger = LoggerFactory.getLogger(FtpFileZipUtls.class);/*** 加载一个非空文件夹*/private static void loadFile(FTPClient ftp, String dirPath, ZipOutputStream zos) throws IOException {FTPFile[] ftpFiles = ftp.listFiles();System.out.println(ftp.printWorkingDirectory());// 该if判断是否是一个文件 如果是一个空文件 直接添加到压缩包if (ftp.changeToParentDirectory()) {logger.info("退回到: " + ftp.printWorkingDirectory());boolean b = ftp.changeWorkingDirectory(getFileName(dirPath.substring(dirPath.lastIndexOf(File.separator) + 1)));logger.info("进入: " + ftp.printWorkingDirectory());// 是一个空文件夹if (b && (ftpFiles == null || ftpFiles.length <= 0)) {zos.putNextEntry(new ZipEntry(getFileName(dirPath) + File.separator));return;}}for (FTPFile f : ftpFiles) {if (f.isFile()) {InputStream in = ftp.retrieveFileStream(f.getName());zos.putNextEntry(new ZipEntry(getFileName(dirPath) + File.separator + f.getName()));addToZOS(in, zos);ftp.completePendingCommand();} else {if (ftp.changeWorkingDirectory(f.getName())) {loadFile(ftp, dirPath + File.separator + f.getName(), zos);// ftp指针移动到上一层ftp.changeToParentDirectory();}}}}/*** 将文件夹中的.替换为^^* @param sb* @return*/private static void replaceFileName(StringBuilder sb, String onepath) {sb.replace(sb.indexOf(onepath), sb.indexOf(onepath) + onepath.length(), onepath.replaceAll("\\.", "^^"));}/*** 将文件夹路径中的 ^^ 替换成.* @param sb* @return*/private static String getFileName(String sb) {StringBuilder result = new StringBuilder(sb);do {if (result.indexOf("^^") > -1) {result.replace(result.indexOf("^^"), result.indexOf("^^") + 2, ".");}} while (result.indexOf("^^") >= 0);return result.toString();}/*** 切换目录 返回切换的层级数* @param sb* @param ftp* @return 切换的层级数* @throws IOException*/private static int exchageDir(StringBuilder sb, FTPClient ftp) throws IOException {// 计入进入的文件夹的次数,方便回退int level = 0;String[] pathes = sb.toString().split("/");for (int i = 0, len = pathes.length; i < len; i++) {String onepath = pathes[i];if (onepath == null || "".equals(onepath.trim())) {continue;}//文件排除boolean flagDir = ftp.changeWorkingDirectory(onepath);if (flagDir) {level++;if (onepath.contains(".")) {//把文件夹中的.用^^代替replaceFileName(sb, onepath);}logger.info("成功连接ftp目录:" + ftp.printWorkingDirectory());} else {logger.warn("连接ftp目录失败:" + ftp.printWorkingDirectory());}}return level;}/*** 处理单个文件和空文件夹的情况  处理了返回true 未处理返回false* 注意:这里是指数组中给的路径直接是文件或者空文件夹的情况* @param ftp* @param path 需要压缩的文件(文件夹)路径(相对根)* @param zos* @return* @throws IOException*/public static boolean delFile(FTPClient ftp, StringBuilder path, ZipOutputStream zos) throws IOException {int times = exchageDir(path, ftp);String fileRelativePaht = path.toString();String[] split = fileRelativePaht.split("/");// 是否处理过boolean isDel = false;//有父级目录if (split != null && split.length > 0) {String lastSegmeng = split[split.length - 1];//path直接是文件if (split[split.length - 1].contains(".")) {zos.putNextEntry(new ZipEntry(fileRelativePaht));addToZOS(ftp.retrieveFileStream(lastSegmeng), zos);ftp.completePendingCommand();isDel = true;} else if (ftp.listFiles().length <= 0) {// 空文件夹zos.putNextEntry(new ZipEntry(fileRelativePaht + File.separator));isDel = true;}// 如果被处理过(空文件夹或者直接给的文件的路径),退回到根路径(以免污染下次循环的ftp指针)if (isDel) {for (int i = 0; i < times; i++) {ftp.changeToParentDirectory();}}}return isDel;}/*** 添加文件到压缩流* @param in  输入流(一般就直接是从FTP中获取的)* @param zos 压缩输出流* @throws IOException*/public static void addToZOS(InputStream in, ZipOutputStream zos) throws IOException {byte[] buf = new byte[1024];//BufferedOutputStream bzos = new BufferedOutputStream(zos);try {for (int len; (len = (in.read(buf))) != -1; ) {zos.write(buf, 0 , len);}} catch (IOException e) {System.out.println("流转换异常");throw e;} finally {if (in != null) {try {in.close();} catch (IOException e) {System.out.println("关流异常");e.printStackTrace();}}}}public static FTPClient getFtpClient(String path) throws Exception {String server = "127.0.0.1";int port = 21;String username = "test";String password = "test";
//        path = "/FTPStation/";FTPClient ftpClient = connectServer(server, port, username, password, path);return ftpClient;}/**** @param server* @param port* @param username* @param password* @param path 连接的节点(相对根路径的文件夹)* @return*/public static FTPClient connectServer(String server, int port, String username, String password, String path) throws IOException {path = path == null ? "" : path;FTPClient ftp = new FTPClient();//下面四行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件// 如果使用serv-u发布ftp站点,则需要勾掉“高级选项”中的“对所有已收发的路径和文件名使用UTF-8编码”ftp.setControlEncoding("GBK");FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);conf.setServerLanguageCode("zh");ftp.configure(conf);// 判断ftp是否存在ftp.connect(server, port);ftp.setDataTimeout(2 * 60 * 1000);if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {ftp.disconnect();System.out.println(server + "拒绝连接");}//登陆ftpboolean login = ftp.login(username, password);if (logger.isDebugEnabled()) {if (login) {logger.debug("登陆FTP成功! ip: " + server);} else {logger.debug("登陆FTP失败! ip: " + server);}}//根据输入的路径,切换工作目录。这样ftp端的路径就可以使用相对路径了exchageDir(new StringBuilder(path), ftp);return ftp;}/*** 多FTP路径压缩* @param ftp* @param savePath* @param filePaths* @throws Exception*/public static void zipFileByPaths(FTPClient ftp, String savePath, String[] filePaths) throws Exception {try (ZipOutputStream zos = getOutPutStream(savePath)) {for (String path : filePaths) {StringBuilder sb = new StringBuilder(path);//delFile时进入的文件夹的路径(当前需要遍历的文件的路径)String before = ftp.printWorkingDirectory();if (delFile(ftp, sb, zos)) {continue;}loadFile(ftp, sb.toString(), zos);// 文件加载完毕后,需要将ftp的指针退到开始状态String after = ftp.printWorkingDirectory();backPath(before, after, ftp);}zos.flush();} catch (Exception e) {logger.error("多路径文件压缩失败");e.printStackTrace();throw e;}}/*** ftp 指针回退* @param end* @param start* @param ftp* @throws IOException*/private static void backPath(String end, String start, FTPClient ftp) throws IOException {for (; !end.equals(start);) {if (ftp.changeToParentDirectory()) {start = ftp.printWorkingDirectory();}}}/*** 获取apache的ZipOutputStream流* @param savePath 保存压缩文件的路径* @return* @throws FileNotFoundException 如果保存路径不存在,那么将会抛异常*/public static ZipOutputStream getOutPutStream(String savePath) throws FileNotFoundException {//输出的压缩原始文件流fileDir + "\\" + "详情.zip"FileOutputStream f = new FileOutputStream(new File(savePath));// 计算和校验文件CheckedOutputStream csum = new CheckedOutputStream(f, new CRC32());// 输出的压缩文件流ZipOutputStream zos = new ZipOutputStream(csum);zos.setComment("dist文件压缩流");//设置压缩工具右边的文字编码  防止右边的说明文字乱码zos.setEncoding(System.getProperty("sun.jnu.encoding"));return zos;}public static void main(String[] args) throws Exception {String[] paths = {"/CAD/你好.txt", "/CAD/1.第一层"};String savePath = "e:/temp/zz.zip";//连接到的节点String rootDir = "/CAD";FTPClient ftp = getFtpClient(rootDir);zipFileByPaths(ftp, savePath, paths);}}

转载于:https://www.cnblogs.com/qiaozhuangshi/p/11216454.html

从ftp获取文件并生成压缩包相关推荐

  1. Bat命令:从Ftp获取文件以及数据导入

    Bat命令-->ftp获取文件,并导入数据库 1.生成ftp命令,放在ftp.txt文件夹中新建一个bat文件(1.createscript.bat) @echo open 服务器IP > ...

  2. linux生成文件清单,Linux 获取文件名称生成列表 txt - create_filelist

    Linux 获取文件名称生成列表 txt - create_filelist 1. find /home/strong/MOTChallenge/MOT16/MOT16/train/MOT16-04/ ...

  3. linux生成一个list文件,Linux 获取文件名称生成列表 txt - create_filelist

    Linux 获取文件名称生成列表 txt - create_filelist 1. find /home/strong/MOTChallenge/MOT16/MOT16/train/MOT16-04/ ...

  4. 关于FTP获取文件,过滤器,下载文件0kb问题

    关于FTP获取文件,过滤器,下载文件0kb问题 下载的时候需要指定文件名编码格式,并且与服务器相同 FTPClient ftpClient = new FTPClient();try {ftpClie ...

  5. java ftp获取文件夹大小,java 用FTPClient 下载文件时不显示总大小?解决方案

    java 用FTPClient 下载文件时不显示总大小? FTPClient ftp = new FTPClient(); ftp.setControlEncoding("utf-8&quo ...

  6. 【转载】ftp获取文件

    https://www.cnblogs.com/weafer/archive/2011/06/13/2079509.html https://www.cnblogs.com/huzixia/p/103 ...

  7. java通过http代理获取FTP的文件

    公司与外部合作项目,需要获取外部合作方ftp上的文件,公司服务器是布置在内网,需要通过代理才能访问到外网. 通常在内网我们访问FTP会使用org.apache.commons.net.ftp.FTPC ...

  8. java ftp读取文件内容_java读取ftp中TXT文件的案例

    最近在开发关于java读取ftp中TXT文件,其中有些坑踩了一下,再次做个记录 1.读取文件时我会根据文件名称去生成数据库表,oracle数据库对于表名的长度是有限制的,最多30个字符 2.对于多个文 ...

  9. C语言下,获取文件信息

    C语言下,如何获取文件的生成时间,日期和文件大小等文件信息. 1.标准库函数并未提供对应的实现,这个Linux上GCC中struct stat的资料 struct stat {dev_t st_dev ...

最新文章

  1. [转]Mysql中的SQL优化与执行计划
  2. html元素和属性,HTML常用元素和属性(一)
  3. 【openCV学习笔记】在Mac上配置openCV步骤详解
  4. 静态static的内存图
  5. python面试题总结(一)字符串反转,写取指定数函数
  6. SQL Sever sa密码丢失
  7. 检查java程序假死的脚本
  8. 架构设计师—你在哪层楼?
  9. [SQL提数]函数的灵活使用
  10. 2020年5月机器视觉工作阶段性总结
  11. 首届Ceph亚太峰会来了!内有粉丝福利
  12. python实现多进程监听声音播放并绘图
  13. selenium调用浏览器打印功能,并保存为PDF
  14. 查看hadoop版本
  15. 勇士大战恶魔?这款桌游明明是套高质量原创手办
  16. 搞懂异地多活,看这篇就够了
  17. 交叉编译arm版linaro-1.13.1-4.7-2013.03
  18. Python订票系统这才是看电影选座的正确方法,原来我们都上当了
  19. 2022交易猫系统+带聊天/安心购/已验号模板+APP双端跳转
  20. 形参与实参的主要区别

热门文章

  1. java中replace()和replaceAll()区别
  2. HDOJ 3732 Ahui Writes Word 多重背包
  3. Python自然语言处理学习笔记(66):7.7 小结
  4. GPUImage滤镜中的shader代码分析,及自定义滤镜
  5. 基于用户投票的排名算法(一):Delicious和Hacker
  6. 立体匹配之NCC算法
  7. SpringBoot 学习 | raibaby Halo v0.4.3 漏洞分析-Ali0th
  8. MySQL绿色版的应用
  9. iOS系类教程之用instruments来检验你的app
  10. 很牛逼的短链接,我们一起来晒晒短链接程序(转)