1. 程式人生 > >使用ftp讀取文件夾中的多個文件,並刪除

使用ftp讀取文件夾中的多個文件,並刪除

byte .get cat 刪除 files arraylist buffered boolean path

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();
必須加上這行代碼。另外輸出文件一定要先關閉流的使用!

使用ftp讀取文件夾中的多個文件,並刪除