关于java调用sftp下载文件报 No such File 错误的问题总结

摘要:
sftp.download(sftp_path,=null&}文件文件=newFile(saveFile);Objectobject=资源.get(“sftp_path”);Stringsftp_path=String.valueOf(对象);}sftp.download(sftp_path;

今晚总结下今下午遇到的java调用sftp下载对账文件报错的问题:

  一开始配置文件是这样写的

  关于java调用sftp下载文件报 No such File 错误的问题总结第1张

 而sftp的路径是这样的

关于java调用sftp下载文件报 No such File 错误的问题总结第2张

java代码是这样写的

 private boolean downloadSettleFile(String downloadPath,String merId,String merDate,SFTPUtil sftp,int num) throws Exception{
        logger.info(" 付款对账文件下载接口开始入参商户号:{},交易日期:{}",merId,merDate);
        String fileName="TAM_MER_"+merId+"_"+merDate+".dat";
        Object object = resource.get("sftp_path");
        String sftp_path=String.valueOf(object);
        sftp.download(sftp_path, fileName, downloadPath+fileName);
        return true;
    }

这样去调用后报错如下

关于java调用sftp下载文件报 No such File 错误的问题总结第3张

 上网查资料,见这方面的资料很少,于是就自己琢磨,一般报这个错是因为路径的问题,看了sftp的路径后以为是从根路径开始,所以修改路径如下,

关于java调用sftp下载文件报 No such File 错误的问题总结第4张

 抱着侥幸的心理再次尝试,结果不尽人意,还是一样的错误,悲哀~

既然这样还不行,那就看看代码怎么写的吧,于是乎,开始梳理代码,进入sftp的下载方法如下

 /** 
     * 下载文件。
     * @param directory 下载目录  
     * @param downloadFile 下载的文件 
     * @param saveFile 存在本地的路径 
     */    
    public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{  
        if (directory != null && !"".equals(directory)) {  
            sftp.cd(directory);  
        }  
        File file = new File(saveFile);  
        sftp.get(downloadFile, new FileOutputStream(file));  
    }    

从代码中不难发现,是把目录当成文件夹名字给cd进去了,然后再在文件夹下找到相应的文件的,恍然大悟啊,修改之后

关于java调用sftp下载文件报 No such File 错误的问题总结第5张

 这样就把cmpay当成一个文件夹进入了,一试,果然可以成功下载了

关于java调用sftp下载文件报 No such File 错误的问题总结第6张

 还有一个需要注意的问题是,如果循环下载文件的时候不要重复进入文件夹,给个变量判断下就好

 private boolean downloadSettleFile(String downloadPath,String merId,String merDate,SFTPUtil sftp,int num) throws Exception{
        logger.info(" 付款对账文件下载接口开始入参商户号:{},交易日期:{}",merId,merDate);
        String fileName="TAM_MER_"+merId+"_"+merDate+".dat";
        Object object = resource.get("sftp_path");
        String sftp_path=String.valueOf(object);
        // 只有第一次下载需要进入文件夹,之后的不需要在进入文件夹
        if(num > 0){
            sftp_path="";
        }
        sftp.download(sftp_path, fileName, downloadPath+fileName);
        return true;
    }

因为我是循环调用的

/**
     * 对账文件入库
     * @param tyjSaleActrDTOList
     * @throws IOException
     */
    private String cmPaymentCheckInsertData(List<TyjSaleActrDTO> tyjSaleActrDTOList) throws IOException {
        logger.info("====对账文件入库开始========");
        String flag = "0";
        Calendar cal = Calendar.getInstance();
        //获取前两天得对账文件对账
        cal.add(Calendar.DATE,-1);
        SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
        String settleDate =sf.format(cal.getTime());
        logger.info(settleDate+"......定时任务下载对账文件开始.........");
        Object obj1=resource.get("mer_id_settle_path");
        String downloadPath=String.valueOf(obj1);
        Object obj2 = resource.get("sftp_username");
        String sftp_username=String.valueOf(obj2);
        Object obj3 = resource.get("sftp_password");
        String sftp_password=String.valueOf(obj3);
        Object obj4 = resource.get("sftp_ip");
        String sftp_ip=String.valueOf(obj4);
        Object obj5 = resource.get("sftp_port");
        String sftp_port=String.valueOf(obj5);
        SFTPUtil sftp = new SFTPUtil(sftp_username,sftp_password,sftp_ip, Integer.parseInt(sftp_port));
        sftp.login();
        for (int i = 0; i < tyjSaleActrDTOList.size(); i++) {
            TyjSaleActrDTO dto=tyjSaleActrDTOList.get(i);
            String merId=dto.getCorpMerchantNum();
            try {
                boolean result =this.downloadSettleFile(downloadPath, merId, settleDate,sftp,i);
                logger.info("商户号:"+merId+"----"+settleDate+"对账日下载对账文件结果:"+result);
                if(result) {
                    try {
                        String fileName=downloadPath+"TAM_MER_"+merId+"_"+settleDate+".dat";
                        logger.info("要入库的对账文件======={}",fileName);
                        File file=new File(fileName);
                        if(file.exists()){
                            InputStreamReader reader = new InputStreamReader(new FileInputStream(fileName),"GBK"); // 建立一个输入流对象reader  
                                BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言  
                                String line = null;  
                                while ((line=br.readLine())!=null) {
                                      CmpaySettleFileRes res=this.chengeToDTO(line);
                                      if(res!=null){
                                          TyjDzResultDTO dzResultDto = new TyjDzResultDTO();
                                          // 提现单id
                                          String transId = res.getRequestId();
                                          dzResultDto.setAccType(res.getAccType());
                                          dzResultDto.setAmount(Double.parseDouble(res.getAmount()==null?"0":res.getAmount()));
                                          dzResultDto.setCreateDate(new Date());
                                          dzResultDto.setDzFileName(fileName);
                                          dzResultDto.setDzState("0");
                                          dzResultDto.setJyf(Double.parseDouble(res.getFeeAmount()==null?"0":res.getFeeAmount()));
                                          dzResultDto.setMerchantId(res.getMerchantId());
                                          dzResultDto.setOrderId(res.getTransNo());
                                          dzResultDto.setOrderTime(res.getOrderDate());
                                          dzResultDto.setOrderSxTime(res.getOrderNoEffectDate());
                                          dzResultDto.setPaymentDate(res.getTransDate());
                                          dzResultDto.setReceiveDate(res.getRecvDate());
                                          dzResultDto.setReceiveTel(res.getReceiveNo());
                                          dzResultDto.setRequestId(transId);
                                          dzResultDto.setStatus(res.getOrderStatus());
                                          dzResultDto.setTransId(transId);
                                          // 保存数据
                                          tYjDzResultService.saveDtoTX(dzResultDto);
                                          logger.info("对账文件===="+fileName+"=====入库成功ok");
                                      }
                                  }
                                br.close();
                            }
                    } catch (Exception e) {
                        flag="2";
                        logger.info("对账文件入库异常======={}",e.getMessage());
                    }
                }
        }catch(Exception e){
             flag="1";
             logger.info("商户号:"+merId+"----"+settleDate+"下载对账执行异常:"+e.getMessage());
        }
      }
      sftp.logout();
      
      return flag;
    }

这是今天解决的一个问题,在这记录下,希望对大家有所帮助,有啥问题及时沟通交流就好,技术方面的问题还是很希望和大家一起探讨的

免责声明:文章转载自《关于java调用sftp下载文件报 No such File 错误的问题总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【九天教您南方cass 9.1】 09 提取坐标的几种方法循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

wpf 窗体翻页效果

点击设置翻页,取消翻回来 1.xaml 1 <Window x:Class="_3D翻页动画.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.m...

TS的tsconfig.json配置

一切教程以官方文档为准   初始化一个tsconfig.json配置文件tsc --init 信息配置信息: { "compilerOptions": { // "incremental": true, // 增置编译 // "tsBuildlnfoFile": "./buildFile",...

【计算机视觉领域】常用的 feature 提取方法,feature 提取工具包

  【计算机视觉领域】常用的 feature 提取方法,feature 提取工具包     利用 VL 工具包进行各种特征的提取:   VL 工具包官网地址:http://www.vlfeat.org/index.html   %% Extract Every kind of Features% the VL_tool box for fea...

11_RHEL安装Maya2015

1. 解压 tar -xvf ./Autodesk_Maya_English_2015_Linux_64bit.tgz 2. 运行 ./setup    2.1补充 如果提示缺少 libpng12.so.0,按照下面步骤解决: 此库文件是个早期的版本,而且软件仓库也没有早期版本的安装包,必须下载早期的版本,并手动编译安装。   下载 wget ftp:...

oracle学习第一天【简单操作】

1,连接数据库 C:\Documents and Settings\Administrator>sqlplus /nolog SQL*Plus: Release 10.1.0.2.0 - Production on 星期六 5月 14 11:14 Copyright (c) 1982, 2004, Oracle.  All rights reserve...

linux上实现jmeter分布式压力测试(转)

摘要:最近根据公司工作的需求,学习了一些压力测试的知识,目前,公司使用的是jmeter进行压力测试。下面就记录下近期的学习。我想将这次的博文分成三个部分:1、开始测试前的准备(测试环境的搭建)2、在一台linux上测试3、多台linux分布式测试首先来看看测试环境的搭建。我是自己创建的linux虚拟机,所以就用它来说说吧。安装linux的过程就不多说了,...