溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java怎么讀取傳輸FTP文件

發(fā)布時(shí)間:2023-04-27 09:42:39 來源:億速云 閱讀:114 作者:zzz 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Java怎么讀取傳輸FTP文件的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Java怎么讀取傳輸FTP文件文章都會(huì)有所收獲,下面我們一起來看看吧。

    一.需求

    FTP作為文件服務(wù)器,由提供服務(wù)方提供遠(yuǎn)程連接地址,連接端口,賬號(hào),密碼等信息。
    根據(jù)以上信息可以建立客戶端連接,隨后對(duì)于建立好的連接可進(jìn)行文件讀取,文件上傳等操作

    二.依賴

    <!-- FTP相關(guān)操作的依賴 -->
    <dependency>
        <groupId>commons-net</groupId>
        <artifactId>commons-net</artifactId>
        <version>3.9.0</version>
    </dependency>
    <!-- IO工具類的依賴 -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.11.0</version>
    </dependency>
    <!-- lombok依賴 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.26</version>
        <scope>provided</scope>
    </dependency>

    三.關(guān)鍵源碼

    3.0 配置信息

    ftp:
      config:
        host: ${env.ftp.config.host:10.1.1.1}
        port: ${env.ftp.config.port:12345}
        username: ${env.ftp.config.username:ftpUsername}
        password: ${env.ftp.config.password:ftpPwd}
        remote-dir-path: ${env.ftp.config.remote-dir-path:/}
    /**
     * @author: Vainycos
     * @description ftp配置信息
     * @date: 2023/4/17 15:16
     */
    @Data
    @Component
    @ConfigurationProperties("ftp.config")
    public class FtpConfig {
        private String host;
        private int port;
        private String username;
        private String password;
        /** 初始讀取根目錄,當(dāng)前默認(rèn)/ */
        private String remoteDirPath;
    }

    3.1 獲取客戶端

    /**
    * 獲取ftp客戶端
    * @return
    */
    public FTPClient getFtpClient(){
        try {
            FTPClient ftpClient = new FTPClient();
            ftpClient.connect(ftpConfig.getHost() ,ftpConfig.getPort());
            // 10分鐘連接時(shí)間
            ftpClient.setConnectTimeout(600000);
            ftpClient.setDefaultTimeout(600000);
            ftpClient.login(ftpConfig.getUsername() ,ftpConfig.getPassword());
            // login后設(shè)置傳輸?shù)哪J?
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            // login后設(shè)置被動(dòng)模式
            ftpClient.enterLocalPassiveMode();
            // login后設(shè)置編碼
            String LOCAL_CHARSET = "GBK";
            // 開啟服務(wù)器對(duì)UTF-8的支持,如果服務(wù)器支持就用UTF-8編碼,否則就使用本地編碼(GBK).
            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
                LOCAL_CHARSET = "UTF-8";
            }
            ftpClient.setControlEncoding(LOCAL_CHARSET);
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                log.error("未連接到FTP,用戶名或密碼錯(cuò)誤!");
                ftpClient.disconnect();
            } else {
                log.info("FTP連接成功!");
            }
            // 切換從某個(gè)根目錄下開始掃描
            ftpClient.changeWorkingDirectory(ftpConfig.getRemoteDirPath());
            return ftpClient;
        }catch (IOException e) {
            log.error("ftp建立連接異常->{}", e);
        }
        return null;
    }

    3.2 獲取ftp文件

    /**
    * 獲取對(duì)應(yīng)目錄下的第一級(jí)目錄文件
    * @param ftpClient client
    * @throws IOException
    */
    public void getFtpFirstDirectoryFiles(FTPClient ftpClient) throws IOException {
        log.info("ftpclient當(dāng)前工作目錄->{}", ftpClient.printWorkingDirectory());
        if (ftpClient != null) {
            FTPFile[] files = ftpClient.listFiles();
            for (FTPFile file : files) {
                String fileName = file.getName();
                if (file.isDirectory()){
                    // 每次從根目錄下查找第一級(jí)目錄
                    String firstDirectory = ftpConfig.getRemoteDirPath() + "/" + fileName;
                    ftpClient.changeWorkingDirectory(firstDirectory);
                    log.info("當(dāng)前目錄->{}, 開始掃描錄音文件", firstDirectory);
                    // 切換目錄后直接遍歷第一級(jí)的文件,不遞歸第二級(jí)目錄
                    dealFile(ftpClient);
                    log.info("{}->目錄掃描結(jié)束", firstDirectory);
                }
            }
        }
    }
    /**
     * 處理目錄下的文件
     * @param ftpClient
     * @throws IOException
     */
    public void dealFile(FTPClient ftpClient) throws IOException {
        FTPFile[] files = ftpClient.listFiles();
            for (FTPFile file : files) {
                String fileName = file.getName();
                if (file.isDirectory()) {
                    log.info("{}->為目錄,跳過", fileName);
                    continue;
                }
                String rootWorkingDirectory = ftpClient.printWorkingDirectory();
                log.info("獲取到文件->{}, 開始獲取ftp文件流, ftpclient工作目錄->{}", fileName, ftpClient.printWorkingDirectory());
                // 開始獲取ftp文件流
                InputStream inputStream = ftpClient.retrieveFileStream(new String(fileName.getBytes("UTF-8"), FTP.DEFAULT_CONTROL_ENCODING));
                if (inputStream == null){
                    log.error("文件不存在->{}", fileName);
                    return;
                }
                byte[] data = IOUtils.toByteArray(inputStream);
                inputStream.close();
                // 關(guān)鍵代碼,如果不執(zhí)行該代碼,后續(xù)的ftpClient操作將會(huì)不生效
                ftpClient.completePendingCommand();
                // 省略...獲取到了inputStream 文件流進(jìn)行后續(xù)處理
               }
    }

    3.3 關(guān)閉ftp服務(wù)連接

    /**
     * 關(guān)閉FTP服務(wù)連接
     * @param ftpClient
     */
    public void disConnection(FTPClient ftpClient) {
        try{
            if(ftpClient.isConnected()){
                ftpClient.disconnect();
            }
        }catch(IOException e) {
            log.error("ftpClient.disconnect失敗->{}", e);
        }
    }

    關(guān)于“Java怎么讀取傳輸FTP文件”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Java怎么讀取傳輸FTP文件”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI