使用ftp读取文件夹中的多个文件,并删除

public class FTPUtils {

    private static final Logger LOG = LoggerFactory.getLogger(FTPUtils.class);

    /**
     * 获取FTPClient对象
     *
     * @param ftpHost     FTP主机服务器
     * @param ftpPassword FTP 登录密码
     * @param ftpUserName FTP登录用户名
     * @param ftpPort     FTP端口 默认为21
     * @return
     */
    private static FTPClient getFTPClient(String ftpHost, String ftpPassword,
                                          String ftpUserName, int ftpPort) throws IOException {
        FTPClient ftpClient = null;
        ftpClient = new FTPClient();
        ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
        ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
        if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            LOG.info("未连接到FTP,用户名或密码错误。");
            ftpClient.disconnect();
        } else {
            LOG.info("FTP连接成功。");
        }
        return ftpClient;
    }

    /**
     * 去 服务器的FTP路径下上读取文件
     *
     * @param ftpPath
     * @param
     * @return
     */
    public static List<JSONArray> readConfigFileForFTP(String ftpPath, String ftpHost, String ftpPassword,
                                                       String ftpUserName, int ftpPort) {
        InputStream in;
        FTPClient ftpClient = null;
        try {
            ftpClient = getFTPClient(ftpHost, ftpPassword, ftpUserName, ftpPort);
            List<JSONArray> list = new ArrayList<>();
            LOG.info("开始读取绝对路径" + ftpPath + "文件!");
            try {
                ftpClient.setControlEncoding("UTF-8"); // 中文支持
                ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
                ftpClient.enterLocalPassiveMode();
                ftpClient.changeWorkingDirectory(ftpPath);
                FTPFile[] ftpFiles = ftpClient.listFiles(ftpPath);
                for (FTPFile file : ftpFiles) {
                    String name = file.getName();
                    in = ftpClient.retrieveFileStream(new String(name.getBytes("UTF-8"), "ISO-8859-1"));
                    if (in != null) {
                        StringBuffer resultBuffer = new StringBuffer();
                        BufferedReader br = new BufferedReader(new InputStreamReader(in));
                        String data;
                        try {
                            while ((data = br.readLine()) != null) {
                                resultBuffer.append(data);
                            }
                            String string = resultBuffer.toString();
                            JSONArray jsonArray = JSONArray.parseArray(string);
                            list.add(jsonArray);
                            in.close();
                            boolean flag = ftpClient.deleteFile(name);
                            if (flag) {
                                System.out.println("删除文件成功");
                            }
                            ftpClient.completePendingCommand();
                        } catch (IOException e) {
                            LOG.error("文件读取错误。");
                            e.printStackTrace();
                        }
                    } else {
                        LOG.error("in为空,不能读取。");
                    }
                }
            } catch (FileNotFoundException e) {
                LOG.error("没有找到" + ftpPath + "文件");
                e.printStackTrace();
            } catch (SocketException e) {
                LOG.error("连接FTP失败.");
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
                LOG.error("文件读取错误。");
            }
            return list;
        } catch (SocketException e) {
            LOG.info("FTP的IP地址可能错误,请正确配置。");
        } catch (IOException e) {
            LOG.info("FTP的端口错误,请正确配置。");
        }
        return null;
    }

    /**
     * * 删除文件 *
     *
     * @param pathname FTP服务器保存目录 *
     * @param filename 要删除的文件名称 *
     * @return
     */
    private static void deleteFile(String pathname, String filename, FTPClient ftpClient) {
        try {
            System.out.println("开始删除文件");
            // 切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);
            boolean flag = ftpClient.deleteFile(filename);
            ftpClient.logout();
            if (flag) {
                System.out.println("删除文件成功");
            }
        } catch (Exception e) {
            System.out.println("删除文件失败");
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

适用于读取一个文件夹中的多个文件,并且每读取一个删除一个。

这里有一个小坑,就是如果文件夹里面有多个文件的时候,读取下一个文件的时候,输入流会报空指针异常,这里关键的一步就是

  ftpClient.completePendingCommand();必须加上这行代码。另外输出文件一定要先关闭流的使用!

原文地址:https://www.cnblogs.com/wxw7blog/p/9929092.html

时间: 2024-10-12 02:52:32

使用ftp读取文件夹中的多个文件,并删除的相关文章

用字符流实现每个文件夹中创建包含所有文件信息的readme.txt

1 package com.readme; 2 3 import java.io.BufferedWriter; 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 import java.text.SimpleDateFormat; 8 import java.util.Date; 9 import java.util.Scanner; 10 11 /** 12 * @autho

.gitignore 规则写法 - 在已忽略文件夹中不忽略指定文件、文件夹【注意项】

1. 在已忽略文件夹中不忽略指定文件夹 /node_modules/* !/node_modules/layer/ 2. 在已忽略文件夹中不忽略指定文件 /node_modules/* !/node_modules/layer/layer.js [注意项]注意写法 要忽略的文件夹一定要结尾 /* ,否则不忽略规则将无法生效 3. 其他规则写法 (附) 以斜杠"/"开头表示目录: 以星号"*"通配多个字符: 以问号"?"通配单个字符 以方括号&qu

删除指定文件夹中除保留的文件外的所有文件批处理 删除指定文件夹下的空文件夹,包括子目录批处理

删除指定文件夹中除保留的文件外的所有文件批处理 @echo off set "ext= sln csproj" for /f "delims=" %%a in ('dir /b/s/a-d *.*') do ( set .= if /i not "%%~nxa"=="%~nx0" ( for %%i in (%ext%) do if /i "%%~xa"==".%%i" set .=.

在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM

题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在"D:\java"文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 myPackage 包中创建一个YMD类,该类具有计算今年的年份.可以输出一个带有年月日的字符串的功能.设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名.年龄.出生日期.程序使用YMD的方法来计算年龄. 主要考包的运用 用到java.util.Calendar

C++实现从一个文件夹中读出所有txt文件

前段时间做项目需要读取一个文件夹里面所有的txt文件,查询资料后得到以下实现方法:首先了解一下这个结构体struct _finddata_t {    unsigned    attrib;    time_t      time_create;       time_t      time_access;       time_t      time_write;    _fsize_t    size;    char        name[260];};其中各成员变量的含义如下:unsi

ubuntu 用shell脚本实现将当前文件夹下全部文件夹中的某一类文件复制到同一文件夹下

当前文件夹下有一些文件和文件夹,当中每一个文件夹里都有若干.txt文件. 如今要求在当前文件夹创建一个新文件夹all,且将那些文件夹全部.txt文件 都复制到文件夹all.在ubuntu12.04的shell脚本实现例如以下: #!/bin/sh # 提示信息 echo "start:" # 定义变量 dst=all pst=.txt # 拷贝文件到目标目录 if [ -d ${dst} ] then echo "${dst} existed" else echo

perl怎么拷贝一个文件到另一个文件夹中或者怎么拷贝文件夹到另一个文件夹

File::Copy 主要提供了copy和move函数#!/usr/bin/perluse strict; use warnings; use File::Copy; my $filein=$ARGV[0]; my $fileout=$ARGV[1];#copy($file1, $dir1);将文件$file1复制到文件夹$dir1中:copy($filein,$fileout) or die "copy $filein to $fileout failed\n"; #move($fi

c#获取文件夹中指定类型的文件

//第一种方法 var files = Directory.GetFiles(path, "*.txt"); foreach (var file in files) Console.WriteLine(file); //第二种方法 DirectoryInfo folder = new DirectoryInfo(path); foreach (FileInfo file in folder.GetFiles("*.txt")) { Console.WriteLine

Android读取Assets文件夹中的内容

Android读取Assets文件夹中的内容 assets文件夹是android程序中存放相关外部文件的一个目录,Android官方提供了相应的方法去访问该文件夹中的内容,故此我们并不需要进行相关的路径判断等代码操作,直接调用相关方法打开文件并得到一个字节输入流(InputStream):然后通过相应的字符编码方式读取字节解码为字符输入流(InputStreamReader):再通过BufferReader对字符输入流读取文本并将字符存入缓冲区以便能提供字符.数组和线段的高效读取:最后我们就能逐