java读取ftp及sftp服务器文件内容

1. ftp
引入依赖

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>

工具类

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class TestRead {
    /**
     * 从FTP读取文件
     * */
    public static List<String> ReadFilesFromFTP(String hostName, int port, String userName, String userPass, String filePath, String fileHead) {
        FTPClient ftpClient = new FTPClient();
        ftpClient.setControlEncoding("UTF-8");
        ftpClient.enterLocalPassiveMode();
        ftpClient.configure(new FTPClientConfig("UNIX"));

        // 文件读取的结果存入result的集合中
        List<String> result = new ArrayList<>();

        try{
            ftpClient.connect(hostName, port);
            ftpClient.login(userName, userPass);
            ftpClient.changeWorkingDirectory(filePath);
            // 找到目录下符合条件的文件
            String[] fs = ftpClient.listNames();
            for(String f : fs) {
                if(f.contains(fileHead)) {
                    InputStream in = ftpClient.retrieveFileStream(f);
                    BufferedReader br = new BufferedReader(new InputStreamReader(in));
                    String str;
                    while((str = br.readLine()) != null) {
                        result.add(str);
                    }
                    br.close();
                    in.close();
                }
            }


        } catch(IOException ie) {
            System.out.println(ie.getMessage());
        }
        return result;
    }
}

2. sftp
引入依赖

<dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
</dependency>

工具类

import com.jcraft.jsch.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class SftpUtils {

    private static ChannelSftp sftp = null;
    private static Session session = null;
    // 登录
    public static ChannelSftp login(String userName,String host,int port,String password) throws JSchException{
        JSch jSch = new JSch();
        // 设置用户名和主机,端口号一般都是22
        session = jSch.getSession(userName, host, port);
        // 设置密码
        session.setPassword(password);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        Channel channel = session.openChannel("sftp");
        channel.connect();

        sftp = (ChannelSftp) channel;
        System.out.println("connect success....");
        return sftp;
    }
    // 退出登录
    public static void logout() {
        if (sftp != null) {
            if (sftp.isConnected()) {
                sftp.disconnect();
            }
        }
        if (session != null) {
            if (session.isConnected()) {
                session.disconnect();
            }
        }
    }
    public static List<String> readFile(String userName,String host,int port,String password,String fPath){
        BufferedReader reader = null;
        List<String> ls = new ArrayList<>();
        // 登录sftp服务器
        try {
            ChannelSftp sftp = SftpUtils.login(userName,host,port,password);
        // 构建文件输入流,读取文件内容取
            reader = new BufferedReader(new InputStreamReader(sftp.get(fPath), StandardCharsets.UTF_8));
            String str;
            while((str = reader.readLine()) != null) {
                ls.add(str);
            }
            reader.close();
            //退出sftp
            SftpUtils.logout();

        } catch (JSchException e) {
            e.printStackTrace();
        } catch (SftpException e) {
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        }
        return ls;
    }
    }
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Java 中,我们可以通过使用 FTP 客户端库来连接到 FTP 服务器并获取全部文件。下面是一个简单的代码示例,演示了如何使用 Apache Commons Net 库来连接到 FTP 服务器并获取所有文件: ```java import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class FTPDemo { public static void main(String[] args) { String server = "ftp.example.com"; int port = 21; String user = "username"; String pass = "password"; FTPClient ftpClient = new FTPClient(); try { // 连接到FTP服务器 ftpClient.connect(server, port); ftpClient.login(user, pass); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 获取服务器上的所有文件 FTPFile[] files = ftpClient.listFiles(); // 下载所有文件 for (FTPFile file : files) { String remoteFilePath = file.getName(); String localFilePath = "C:/downloads/" + remoteFilePath; OutputStream outputStream = new FileOutputStream(localFilePath); InputStream inputStream = ftpClient.retrieveFileStream(remoteFilePath); byte[] bytesArray = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(bytesArray)) != -1) { outputStream.write(bytesArray, 0, bytesRead); } boolean success = ftpClient.completePendingCommand(); if (success) { System.out.println("文件 " + remoteFilePath + " 下载成功。"); } inputStream.close(); outputStream.close(); } } catch (IOException ex) { System.out.println("连接到FTP服务器失败: " + ex.getMessage()); ex.printStackTrace(); } finally { try { if (ftpClient.isConnected()) { ftpClient.logout(); ftpClient.disconnect(); } } catch (IOException ex) { ex.printStackTrace(); } } } } ``` 在上面的代码中,我们首先使用 `FTPClient` 对象连接到 FTP 服务器,然后使用 `listFiles()` 方法获取服务器上的所有文件。接着,我们使用 `retrieveFileStream()` 方法下载每个文件,并将其保存到本地文件系统中。最后,我们使用 `completePendingCommand()` 方法来通知服务器我们已经完成了文件下载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值