Java 模拟FTP工具操作远程服务器文件

3 篇文章 1 订阅
模拟FTP功能操作远程服务器上的文件,java有多种处理方式:
1. 采用FTP协议,通过apache的FTPClient。
2. 采用SFTP协议,通过ChannelSftp。
3. 采用SSH协议,通过SCPClient,也就是本文所采用的的方式。
1. 导入FTP相关依赖
<!-- ftp 所需的依赖 -->
<dependency>
	<groupId>ch.ethz.ganymed</groupId>
	<artifactId>ganymed-ssh2</artifactId>
	<version>262</version>
</dependency>
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>3.1.0</version>
	<!--<scope>provided</scope>-->
</dependency>
2. 连接远程服务器
public static Connection login(String host, String user, String password) {
    Connection conn = new Connection(host);
    try {
        //连接远程服务器
        conn.connect();
        //使用用户名和密码登录
        boolean b = conn.authenticateWithPassword(user, password);
        if (b) {
            return conn;
        }
    } catch (IOException e) {
        System.err.printf("用户%s密码%s登录服务器%s失败!", user, password, host);
        e.printStackTrace();
    }
    return null;
}
3. 获取FTP文件流
 /**
   * 获取FTP文件输入流
   * @param conn
   * @param fileName
   */
  public static InputStream copyFile2(Connection conn, String fileName) {
      SCPClient sc = new SCPClient(conn);
      try {
          return sc.get(fileName);
      } catch (IOException e) {
          e.printStackTrace();
      }
      return null;
  }
4. 递归获取路径下的所有文件属性
/**
  * 在远程LINUX服务器上,在指定目录下,获取文件各个属性
  * @param[in] conn Conncetion对象
  * @param[in] remotePath 远程主机的指定目录
  */
 public static TreeNodeDTO getFileProperties(Connection conn, String path) {
     try {
         SFTPv3Client sft = new SFTPv3Client(conn);
         TreeNodeDTO rootNode = new TreeNodeDTO();
         dfsFiles(sft, rootNode, path);
         sft.close();
         return rootNode;
     } catch (Exception e1) {
         e1.printStackTrace();
     }
     return null;
 }

 public static void dfsFiles(SFTPv3Client sft, TreeNodeDTO rootNode, String path) {
     List<SFTPv3DirectoryEntry> v = null;
     try {
         v = sft.ls(path);
         if (null == v || v.size() == 0) {
             return;
         }
     } catch (IOException e) {
         e.printStackTrace();
     }
     List<TreeNodeDTO> list = new ArrayList<>();
     for (int i = 0; i < v.size(); i++) {
         SFTPv3DirectoryEntry s = v.get(i);
         SFTPv3FileAttributes attr = s.attributes;\
         // 不判断这个,会导致死循环
         if (attr.isDirectory() && (s.filename.equals(".") || s.filename.equals(".."))) {
             continue;
         }
         TreeNodeDTO nodeDTO = new TreeNodeDTO();
         nodeDTO.setFilename(s.filename);
         nodeDTO.setSize(FileUtils.convertSize(attr.size));
         nodeDTO.setIsDirectory(attr.isDirectory());
         Date createTime = new Date(attr.atime * 1000L);
         Date modifyTime = new Date(attr.mtime * 1000L);
         nodeDTO.setCreateTime(createTime);
         nodeDTO.setModifyTime(modifyTime);
         // 递归
         if (attr.isDirectory()) {
             dfsFiles(sft, nodeDTO, path + "/" + s.filename);
         }
         list.add(nodeDTO);
     }
     rootNode.setChildren(list);
 }
5. TreeNode 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TreeNodeDTO implements Serializable {
    private String filename; // 文件名
    private String path; // 文件路径
    private String size; // 文件尺寸
    private Boolean isDirectory; // 是否是目录
    private Date createTime; // 文件创建时间
    private Date modifyTime; // 文件修改时间
    private List<TreeNodeDTO> children = new ArrayList<>();
}
测试
public static void main(String[] args) {
        Connection conn = FtpUtils.login("192.168.0.23", "root", "123456");
        TreeNodeDTO fileProperties = FtpUtils.getFileProperties(conn, "/data/doodle");
        System.out.println(fileProperties);
        System.out.println("=============================================");
        FtpUtils.copyFile(conn, "/data/doodle/1.txt");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值