java ftp下載檔案
阿新 • • 發佈:2018-12-08
public void readFire(FireFtpConfig ftpConfig) { FTPClient ftpClient = new FTPClient(); Date now = new Date(); try { log.debug("登入ftp:{}", ftpConfig.getHost()); ftpClient.connect(ftpConfig.getHost(), ftpConfig.getPort()); ftpClient.login(ftpConfig.getUsername(), ftpConfig.getPassword()); ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true)); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setControlEncoding("UTF-8"); ftpClient.enterLocalPassiveMode(); log.debug("登入成功"); String dir = DatePatternUtil.get("20180925").format(now); // String rootPath = ftpConfig.getDirpath() + dir; String rootPath = ftpConfig.getDirpath() + "20181000"; String[] files = ftpClient.listNames(rootPath); List<String> dataNameList = FirePointReadUtil.readFilePath(ftpClient, rootPath); for (String dataName : dataNameList) { InputStream inputStream = ftpClient.retrieveFileStream(dataName); if (dataName.endsWith(".csv") && inputStream != null) { readFtp(inputStream, now, "csv"); } else if (dataName.endsWith(".rar") && inputStream != null) { readFtp(inputStream, now, "rar"); } //這裡需要注意,如果不寫下面兩部,則再次讀取得流為null inputStream.close(); ftpClient.completePendingCommand(); } } catch (IOException e) { log.error("讀取檔案是發生錯誤", e); } finally { if (ftpClient.isConnected()) { try { ftpClient.logout(); ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } }
下面是遞迴獲取ftp的資料夾下所有檔案絕對路徑
private static List<String> readFilePath(FTPClient ftpClient, String path) throws IOException { List<String> paths = new ArrayList(); for (FTPFile file : ftpClient.listFiles(path)) { if (file.isDirectory()) { paths.addAll(readFilePath(ftpClient, path + "/" + file.getName())); } if (file.isFile()) { paths.add(path + "/" + file.getName()); } } return paths; }