精华内容
下载资源
问答
  • java代码利用Jsch实现在windows平台获取linux服务器文件,已包含 jsch jar包
  • java调用Linux命令获取输出流,用于解决获取不到输出流的方法
  • 一、依赖 <dependency> <groupId>com.trilead</groupId> <artifactId>trilead-ssh2</artifactId> <version>... * 获取conn * @param ip * @param port

    前言

    项目中需要从一台服务器调取其他Linux服务器上的文件,并上传到其他服务器接口中;用的是通过文件流上传;

    主要是用的: session.execCommand(str) 和session.getStdout() 来获取读取到的文件流;

    开始一直读取不到文件的实际大小,一直是0字节;

    后来在两个方法之间加了休眠,但实际运行中,还有部分文件没有获取到实际大小,还是0字节;

    再后来又优化了一下,应该是都读取成功了。

    如果读取的文件过大、或者网络不好,建议加大休眠时间试试。

    ---------------------------------------------------------2020.06.09优化-----------------------------------------------------------

    程序运行了数周后,对接方有反馈文件大小不一致,经排查,好像最终上传时文件流中的大小还不是实际文件的大小,可能只读取了一部分就开始上传了;

    优化后的方案是:先执行命令获取文件大小,再用命令获取文件流,对比文件的大小还流的大小,一致时再往下执行。

    一、依赖

    <dependency>
       <groupId>com.trilead</groupId>
       <artifactId>trilead-ssh2</artifactId>
       <version>1.0.0-build222</version>
    </dependency>

    二、代码

    /**
         * 获取conn
         * @param ip
         * @param port
         * @param user
         * @param pwd
         * @return
         */
        private static Connection getConn(String ip, int port, String user, String pwd) {
            Connection conn = new Connection(ip, port);
            if(conn.isAuthenticationComplete()) {
                return conn;
            }
            try {
                conn.connect();
                boolean isAuthenticated = conn.authenticateWithPassword(user, pwd);
                if(!isAuthenticated) {
                    throw new BaseException("authentication failed!");
                }
                return conn;
            } catch (Exception e) {
                log.error("Connect error:", e);
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 获取session
         * @param conn
         * @return
         * @throws IOException
         */
        public static Session getSession(Connection conn) throws IOException{
            Session session = conn.openSession();
            return session;
        }
    
        /**
         * 获取SFTPv3Client
         * @param conn
         * @return
         * @throws IOException
         */
        public static SFTPv3Client getClient(Connection conn) throws IOException {
            SFTPv3Client client = new SFTPv3Client(conn);
            return client;
        }
    

    1.主要方法:

    /**
         * 读取远端文件流
         * @param filePath
         * @return
         * @throws IOException
         */
        private static InputStream readFile(Connection conn, String filePath, String ip) throws IOException, InterruptedException {
            Session session = getSession(conn);
            //获取文件大小
            session.execCommand("du -b ".concat(filePath));
            InputStream sizeIn = new StreamGobbler(session.getStdout());
            //将字节流向字符流的转换。
            InputStreamReader isr = new InputStreamReader(sizeIn);//读取
            //创建字符流缓冲区
            BufferedReader bufr = new BufferedReader(isr);//缓冲
            String line;
            int fileSize = 0;
            while((line = bufr.readLine())!=null){
                String[] fileAttr = line.split("\t");
                fileSize = Integer.parseInt(fileAttr[0]);
            }
            isr.close();
            session.close();
            log.info("          【" + ip + "】【文件大小】" + fileSize);
    
    
            session = getSession(conn);
            session.execCommand("cat ".concat(filePath));
            //休眠2秒再获取返回信息,防止网络传输过程中延迟造成读取文件大小为0字节
            //Thread.sleep(2000);
            InputStream is = new StreamGobbler(session.getStdout());
            session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
            //获取指令是否成功执行:0-成功,非0-失败.
            //int ret = session.getExitStatus();
            //log.info("          【" + ip + "】【命令执行结果】" + (0 == ret ? "---成功---" : "====失败===="));
            log.info("          【" + ip + "】【获取到当前文件流为】" + is.available());
            int i = 0;
            while (fileSize != is.available()) {
                i++;
                Thread.sleep(1000);
                log.info("          【" + ip + "】【第" + i + "次获取到当前文件流为】" + is.available());
            }
            session.close();
            return is;
        }

    2.其他方法:

    /**
         * 判断远程服务器路径是否是目录
         * @param client
         * @param path
         * @return
         */
        private static boolean isDirectory(SFTPv3Client client, String path) {
            try {
                SFTPv3FileAttributes attributes = client.stat(path);
                return attributes.isDirectory();
            } catch(IOException e) {
                log.error("获取文件属性异常", e);
            }
            return false;
        }

     

    展开全文
  • windows linux 下,获取java项目绝对路径的方法,struts2设置了struts.multipart.saveDir后会在根目录建立文件夹,这样会涉及linux下的权限问题
  • Java获取Java所在的根目录,可以在Windows和LINUX两个平台中使用,都可以得到JAVA所在的路径,程序使用JComboBox组合框组件来存放获得的根目录信息,如在Linux 和Unix 系统下组合框只有一项即“/”,截图是Windows...
  • 如题,我目前做一个加解密工具,linux下使用。加解密没问题,但是解密后的文件与原文件权限不一致,有人支个招吗
  • JAVA下载远程Linux服务器的文件

    热门讨论 2014-08-05 18:22:31
    JAVA通过SMB的方式下载、上传远程Linux服务器的文件
  • Java项目Linux下读取文件

    千次阅读 2020-11-22 14:17:54
    Java项目Linux下读取文件(No such file or directory),读取不到文件问题总结 1.路径问题 windows中文件路径用 \ 表示,Linux文件路径用 / 表示; Java中提供了一个与平台无关的表示路径的常量 File.separator...

    Java项目Linux下读取文件(No such file or directory),读取不到文件问题总结

    1.路径问题

    windows中文件路径用 \ 表示,Linux中文件路径用 / 表示;

    Java中提供了一个与平台无关的表示路径的常量 File.separator,如:String strFile=File.separator+"opt"+File.separator+"note.txt";//表示绝对路径 /opt/note.txt

    2.权限问题

    读取的文件要是可读的,chmod 777 note.txt

    PS:反正我遇到的不是这个问题,详情请百度。

    3.文件编码问题

    windows下和Linux下文件编码不一致,

    System.getProperty("file.encoding")//查看文件编码

    4.jar包部署平台的问题,比如Docker,读取下载的文件路径都是要映射的

    -v /opt/tmp/:/opt/temp/

     

    前面三个还好说,可以排查;第四个不注意真的想不到!!!

    展开全文
  • Java根据路径获取文件内容

    千次阅读 2018-10-22 09:43:33
    给出一个资源路径、然后获取资源文件信息,常见三种方式:①网络地址 ②本地绝对路径 ③本地相对路径 一、思路 首先,给出一个string表示资源文件的标识,如何判断是网络中的文件还是本地的文件? *http开头的...


    给出一个资源路径、然后获取资源文件信息,常见三种方式:①网络地址 ②本地绝对路径 ③本地相对路径

    一、思路

    首先,给出一个string表示资源文件的标识,如何判断是网络中的文件还是本地的文件?

    *http开头的可以看成是网络文件
    *其余的可看成本地文件
    

    对于mac和linux系统而言:
    *以 / 和 ~ 开头的表示绝对路径
    *其他的看做是相对路径

    对于windows系统而言,绝对路径形如c:\test.text
    *路径中包含 : 看成是绝对路径
    *以 \ 开头看做的绝对路径

    二、实现

    判断操作系统:

    /**
     * 是否windows系统
     */
    public static boolean isWinOS() {
        boolean isWinOS = false;
        try {
            String osName = System.getProperty("os.name").toLowerCase();
            String sharpOsName = osName.replaceAll("windows", "{windows}").replaceAll("^win([^a-z])", "{windows}$1")
                    .replaceAll("([^a-z])win([^a-z])", "$1{windows}$2");
            isWinOS = sharpOsName.contains("{windows}");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return isWinOS;
    }
    

    绝对路径与否判断:

    public static boolean isAbsFile(String fileName) {
        if (OSUtil.isWinOS()) {
            // windows 操作系统时,绝对地址形如  c:\descktop
            return fileName.contains(":") || fileName.startsWith("\\");
        } else {
            // mac or linux
            return fileName.startsWith("/");
        }
    }
    
    /**
     * 将用户目录下地址~/xxx 转换为绝对地址
     *
     * @param path
     * @return
     */
    public static String parseHomeDir2AbsDir(String path) {
        String homeDir = System.getProperties().getProperty("user.home");
        return StringUtils.replace(path, "~", homeDir);
    }
    

    文件获取封装类:

    public static InputStream getStreamByFileName(String fileName) throws IOException {
        if (fileName == null) {
            throw new IllegalArgumentException("fileName should not be null!");
        }
    
        if (fileName.startsWith("http")) {
            // 网络地址
            return HttpUtil.downFile(fileName);
        } else if (BasicFileUtil.isAbsFile(fileName)) {
            // 绝对路径
            Path path = Paths.get(fileName);
            return Files.newInputStream(path);
        } else if (fileName.startsWith("~")) {
            // 用户目录下的绝对路径文件
            fileName = BasicFileUtil.parseHomeDir2AbsDir(fileName);
            return Files.newInputStream(Paths.get(fileName));
        } else { // 相对路径
            return FileReadUtil.class.getClassLoader().getResourceAsStream(fileName);
        }
    }
    

    原文地址:
    灰灰blog

    展开全文
  • 一、 //文件夹下所有文件名称集合 List<String> files = new ArrayList<String>();...//获取所有文件,放到文件数组里 File[] fileList = file.listFiles(); for (int i = 0;i<fi...
    一、
    //文件夹下所有文件名称集合
    List<String> files = new ArrayList<String>();
    //填写服务器上文件的路径
    File file = new File("/path...");
    //获取所有文件,放到文件数组里
    File[] fileList = file.listFiles();
    for (int i = 0;i<fileList.length ;i++) {
       //排除是隐藏文件
       if (fileList[i].isFile() && !fileList[i].isHidden()){
          //循环把文件名放到list里
          files.add(fileList[i].getName());
       }
    }
    if (files.size() <= 0){
        return;
    }else{        
        for (String fileName: files) {
          //TODO 通过文件名称 循环获取文件内容
        }
    }

    二、

    /**

    * 执行linux命令的工具类

    */

    public static String executeLinuxCmd(String cmd) throws IOException {
        String returnString = "";
        Process pro = null;
        Runtime runTime = Runtime.getRuntime();
        if (runTime == null) {
            System.err.println("Create runtime false!");
        }
        System.out.println("开始转换");
        pro = runTime.exec(cmd);
        BufferedReader input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
        PrintWriter output = new PrintWriter(new OutputStreamWriter(pro.getOutputStream()));
        String line;
        while ((line = input.readLine()) != null) {
            System.out.println("line: " + line);
            returnString = returnString + line + "\n";
        }
        System.out.println("返回值:" + returnString);
        input.close();
        output.close();
        pro.destroy();
        return returnString;
    }
    展开全文
  • javalinux服务器下载文件

    千次阅读 2020-09-05 21:43:35
    javalinux服务器下载文件到本地 最近做项目,使用的技术较老,前端用的架构是jsp,主要技术是jquery、js、css、html等,后端用到的主要是springmvc、存储过程等。 下面是一个文件下载的简单实现。主要是客户在...
  • 原来模板文件读取方式: /** * 配置文件常量 * * @author */ @Component public class PathConstants { /** * 系统配置根目录 */ public static String GLOBAL_CONF_ROOT; @Value("${ra.global.conf.pa....
  • Java远程实现Linux文件内容读取

    万次阅读 2018-06-07 19:03:56
    //首先要下载...import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList;...
  • java代码获取linux路径下的图片文件并返回给前端展示 java代码获取linux路径下的图片文件并返回给前端展示 已知图片文件所在的linux目录,如何展示给前端; // 后端代码 @PostMapping("/getPic") public void ...
  • Java 读取linux上的文件

    千次阅读 2018-01-27 17:04:00
    一个导出表格的功能,在本地没问题,发布到linux服务器就报找不到文件问题,但是模板文件已经在linux下了。刚开始以为是模板放的路径错了,,确认好几遍还是有问题。 经过大神的指导,最后发现原来linux文件的文字...
  • Linux获取java应用的Dump文件

    千次阅读 2019-01-16 23:54:46
    1、获取应用的pid 使用ps -ef | grep java查询服务器上的java应用进程信息,找到应用进程及id...注:/home/app/dump.out表示生成的dump文件的存放地址及文件名,17740表示1中查询到的应用pid 3、分析dump文件 可使用...
  • Java读取Linux文件

    万次阅读 2018-09-28 16:53:23
    public void readFile() { //创建远程连接,默认连接端口为22,如果不使用默认,可以使用方法 //new Connection(ip, port)创建对象 String ip = ""; String usr = "";... String pwd = "...
  • 给出一个资源路径,然后获取资源文件的信息,可以说是非常常见的一种需求场景了,当然划分一下,本文针对最常见的三种状况进行分析 网络地址 本地绝对路径 本地相对路径 I. 实现 1. 思路 http or no-http 给出一...
  • 针对linux下,没有那个文件或目录的原因:1、有可能是文件没有权限,用 ls -l 命令查下权限,如下:-rw-r-----. 1 root总共有10位,第一个'-'先不看,从第二个往后看。r 表示可读取,w 表示可写入,x 表示可执行。2...
  • private final String PATH = "/mbp/file/cmbc/rechg/"+new SimpleDateFormat("yyyyMMdd").format(new Date())+"/单笔联机代付THWJ_XXX_"+new SimpleDateFormat("yyyyMMdd... 文件地址没错,为什么读取失败了,求大神
  • LinuxJava 读取文件路径

    千次阅读 2020-07-23 17:29:50
    用 File.separator; 具体用法例程: windows: String file_path =java\src\myjava; linux: String file_path ="java"+File.separator+"src"+File.separator+"myjava";
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的...
  • javalinux上创建文件,写入内容

    千次阅读 2020-07-26 10:42:45
    javalinux上创建文件,写入内容 1:首先创建全路径, public void mkTemporaryDirs(){ String filePath = "temporaryDir/file/temp.txt"; File file = new File(filePath); if (!file .getParentFile().exists...
  • Linux系统下Java程序读取配置文件

    千次阅读 2020-10-28 16:46:45
    我们知道的ClassLoader 方式只能读取类路径下的配置文件,当项目打成 jar 包放到服务器后就找不到文件了,打成jar包后必须以流的方式读取文件。 // 使用InPutStream流读取properties文 BufferedReader ...
  • Java 在websphere Linux获取项目路径

    千次阅读 2018-03-20 15:12:05
    下载文件时想获取到项目的路径,读取配置文件获取项目路径,尝试好几种方式,tomcat下都正常,但在wars,Linux环境下获取不到,最后用以下方式得以解决。(可能跟服务器及部署方式不同获取方式不一样)这种方式在...
  • <!-- window64位 ffmpeg --> <groupId>ws.schild <artifactId>jave-native-win64 <version>2.4.6 <!-- linux64位 ffmpeg --> <dependency>
  • java上传文件linux文件

    千次阅读 2020-07-06 10:13:46
    最近一个项目的需求是上传文件到图片服务器中,图片服务器是部署在linux上的一个tomcat容器,话不多说,直接上代码 一个工具类即可搞定: package com.supermap.sbsm.util; import com.jcraft.jsch.Channel; ...
  • package com.test.demo.controller; import ch.ethz.ssh2.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream;...import java.io.InputStreamReader;...import java.util.Ar...
  • JAVA获取Linux服务器信息

    千次阅读 2018-09-06 11:31:11
    第一种–获取简单的基本信息,直接读取linux系统中的文件获取。 package hotelPro; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import ...
  • JAVA读取远程文件

    2012-06-04 15:00:20
    JAVA实现缓冲多线程无阻塞读取远程文件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 214,543
精华内容 85,817
关键字:

java根据linux地址获取文件

java 订阅
linux 订阅