JAVA远程读取服务器文件

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: JAVA远程读取服务器文件
<dependency>
    <groupId>ch.ethz.ganymed</groupId>
    <artifactId>ganymed-ssh2</artifactId>
    <version>build210</version>
</dependency>
  • 登录远程服务器
public boolean login(){
  //创建远程连接,默认连接端口为22,如果不使用默认,可以使用方法
  //new Connection(ip, port)创建对象
  Connection conn = new Connection(ip);        
  try {
    //连接远程服务器
    conn.connect();
    //使用用户名和密码登录
        return conn.authenticateWithPassword(usr, psword);
  } catch (IOException e) {   
    System.err.printf("用户%s密码%s登录服务器%s失败!", usr, psword, ip);
    e.printStackTrace();
  }
  return false;
}
/**
  * 上传本地文件到服务器目录下
  * @param conn Connection对象
  * @param fileName 本地文件
  * @param remotePath 服务器目录
  */
public void putFile(Connection conn, String fileName, String remotePath){
  SCPClient sc = new SCPClient(conn);
  try {
    //将本地文件放到远程服务器指定目录下,默认的文件模式为 0600,即 rw,
    //如要更改模式,可调用方法 put(fileName, remotePath, mode),模式须是4位数字且以0开头
    sc.put(fileName, remotePath);
  } catch (IOException e) {
    e.printStackTrace();
  }
}
/**
  * 下载服务器文件到本地目录
  * @param fileName 服务器文件
  * @param localPath 本地目录
  */
public void copyFile(Connection conn, String fileName,String localPath){
  SCPClient sc = new SCPClient(conn);
  try {
    sc.get(fileName, localPath);
  } catch (IOException e) {
    e.printStackTrace();
  }
}
/**
     * 获得远程服务器文件夹下所有文件
     *
     * @param remoteDir
     * @param localTargetDirectory
     */
    public void getFiles(String remoteDir, String localTargetDirectory) {
        Connection conn = new Connection(ip, port);
        Connection conn2 = getConn2(ip, port, username, password);
        SFTPv3Client sft = null;
        try {
            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username, password);
            if (!isAuthenticated) {
                System.err.println("authentication failed");
            }
            SCPClient client = new SCPClient(conn);
            sft = new SFTPv3Client(conn2);
            //获取远程目录下文件列表
            Vector<?> v = sft.ls(remoteDir);
            for (int i = 0; i < v.size(); i++) {
                SFTPv3DirectoryEntry s = (SFTPv3DirectoryEntry) v.get(i);
                if (fileType(s.filename)) {
                    client.get(remoteDir + "/" + s.filename, localTargetDirectory);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (sft != null) {
                sft.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
    }
/**
 * 在远程LINUX服务器上,在指定目录下,获取文件各个属性
 * @param[in] conn Conncetion对象
 * @param[in] remotePath 远程主机的指定目录
 */
public void getFileProperties(Conncetion conn, String remotePath){
  try {
    SFTPv3Client sft = new SFTPv3Client(conn);
    Vector<?> v = sft.ls(remotePath);
    for(int i=0;i<v.size();i++){
      SFTPv3DirectoryEntry s = new SFTPv3DirectoryEntry();
      s = (SFTPv3DirectoryEntry) v.get(i);
      //文件名
      String filename = s.filename;
      //文件的大小
      Long fileSize = s.attributes.size;
    }
    sft.close();
  } catch (Exception e1) {
    e1.printStackTrace();
  }
}
/**
 * 在远程LINUX服务器上,在指定目录下,删除指定文件
 * @param[in] fileName 文件名
 * @param[in] remotePath 远程主机的指定目录
 * @return
 */
public void delFile(String remotePath, String fileName){
  try {
    SFTPv3Client sft = new SFTPv3Client(conn);
    //获取远程目录下文件列表
    Vector<?> v = sft.ls(remotePath);
    for(int i=0;i<v.size();i++){
      SFTPv3DirectoryEntry s = new SFTPv3DirectoryEntry();
      s = (SFTPv3DirectoryEntry) v.get(i);
      //判断列表中文件是否与指定文件名相同
      if(s.filename.equals(fileName)){
        //rm()方法中,须是文件绝对路径+文件名称
        sft.rm(remotePath + s.filename);
      }
    sft.close();
  } catch (Exception e1) {
    e1.printStackTrace();
  }
}
/**
 * 执行脚本
 * @param conn Connection对象
 * @param cmds 要在linux上执行的指令
 */
public int exec(Connection conn, String cmds){
  InputStream stdOut = null;
  InputStream stdErr = null;
  int ret = -1;
  try {
    //在connection中打开一个新的会话
    Session session = conn.openSession();
    //在远程服务器上执行linux指令
    session.execCommand(cmds);
    //指令执行结束后的输出
    stdOut = new StreamGobbler(session.getStdout());
    //指令执行结束后的错误
    stdErr = new StreamGobbler(session.getStderr());
    //等待指令执行结束
    session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
      //取得指令执行结束后的状态
    ret = session.getExitStatus(); 
    conn.close();
  }catch(Exception e){
     e.printStackTrace();
  }
  return ret;
}
  • controller
package com.sun.redis.controller;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.sun.redis.util.FileUtil;
import com.sun.redis.util.LinuxLogin;
@RestController
@RequestMapping("/fileDownCtl")
public class FileDownController {
  @Autowired
  private FileUtil fileUtil;
  @Autowired
  private LinuxLogin linuxLogin;
  @RequestMapping(value="/getFile",method=RequestMethod.GET)
  public void getFile(HttpServletResponse response){
    String path = "D:/Games/WarCraft/BeeWind软件站说明.txt";
    fileUtil.getListFileList(path, response);
  }
  @RequestMapping(value="/getLinuxFile",method=RequestMethod.GET)
  public void getLinuxFile(HttpServletResponse response) throws IOException{
    String fileName = "linux.txt";
    String path = "/home/hadoop/text/";
    linuxLogin.login();
    response.reset();
        response.setContentType("bin");
        response.setContentType("octets/stream");
        response.addHeader("Content-Type", "text/html; charset=utf-8");
        response.addHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("UTF-8"),"ISO8859-1"));
    linuxLogin.copyFile(linuxLogin.conn, path+fileName,response.getOutputStream());
  }
}
  • 工具类
package com.sun.redis.util;
import java.io.IOException;
import java.util.Vector;
import javax.servlet.ServletOutputStream;
import org.springframework.stereotype.Component;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.SFTPv3Client;
import ch.ethz.ssh2.SFTPv3DirectoryEntry;
@Component
public class LinuxLogin {
  public static Connection conn = null;
  public  boolean login(){
    //创建远程连接,默认连接端口为22,如果不使用默认,可以使用方法
    //new Connection(ip, port)创建对象
    conn = new Connection("192.168.159.128");        
    try {
      //连接远程服务器
      conn.connect();
      //使用用户名和密码登录
          return conn.authenticateWithPassword("hadoop", "hadoop");
    } catch (IOException e) {   
      System.err.printf("用户%s密码%s登录服务器%s失败!", "hadoop", "hadoop", "192.168.159.128");
      e.printStackTrace();
    }
    return false;
  }
  /**
   * 复制到JAVA所在服务器
   * @param conn
   * @param fileName
   * @param localPath
   */
  public void copyFile(Connection conn, String fileName,String localPath){
    SCPClient sc = new SCPClient(conn);
    try {
      sc.get(fileName, localPath);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /**
   * 流式输出,用于浏览器下载
   * @param conn
   * @param fileName
   * @param outputStream
   */
  public void copyFile(Connection conn, String fileName,ServletOutputStream outputStream){
    SCPClient sc = new SCPClient(conn);
    try {
      sc.get(fileName, outputStream);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /**
   * 在远程LINUX服务器上,在指定目录下,获取文件各个属性
   * @param[in] conn Conncetion对象
   * @param[in] remotePath 远程主机的指定目录
   */
  public void getFileProperties(Connection conn, String remotePath){
    try {
      SFTPv3Client sft = new SFTPv3Client(conn);
      Vector<?> v = sft.ls(remotePath);
      for(int i=0;i<v.size();i++){
        SFTPv3DirectoryEntry s = new SFTPv3DirectoryEntry();
        s = (SFTPv3DirectoryEntry) v.get(i);
        //文件名
        String filename = s.filename;
        //文件的大小
        Long fileSize = s.attributes.size;
      }
      sft.close();
    } catch (Exception e1) {
      e1.printStackTrace();
    }
  }
  public static void main(String args[]){
    LinuxLogin log = new LinuxLogin();
    System.out.println(log.login());
  }
}


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
12天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
46 9
|
13天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
43 2
|
17天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
40 2
|
25天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
27天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
36 4
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
1月前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
2月前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
228 1
|
2月前
|
缓存 Java 程序员
Java|SpringBoot 项目开发时,让 FreeMarker 文件编辑后自动更新
在开发过程中,FreeMarker 文件编辑后,每次都需要重启应用才能看到效果,效率非常低下。通过一些配置后,可以让它们免重启自动更新。
28 0
|
2月前
|
前端开发 Docker 容器
主机host服务器和Docker容器之间的文件互传方法汇总
Docker 成为前端工具,可实现跨设备兼容。本文介绍主机与 Docker 容器/镜像间文件传输的三种方法:1. 构建镜像时使用 `COPY` 或 `ADD` 指令;2. 启动容器时使用 `-v` 挂载卷;3. 运行时使用 `docker cp` 命令。每种方法适用于不同场景,如静态文件打包、开发时文件同步及临时文件传输。注意权限问题、容器停止后的文件传输及性能影响。
199 0