使用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();
                }
            }
        }
    }

}

適用於讀取一個文件夾中的多個文件,而且每讀取一個刪除一個。json

這裏有一個小坑,就是若是文件夾裏面有多個文件的時候,讀取下一個文件的時候,輸入流會報空指針異常,這裏關鍵的一步就是服務器

  ftpClient.completePendingCommand();必須加上這行代碼。另外輸出文件必定要先關閉流的使用!
相關文章
相關標籤/搜索