最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

EDI中JAVA通過(guò)FTP工具實(shí)現(xiàn)文件上傳下載實(shí)例

 更新時(shí)間:2016年11月07日 15:59:35   作者:Jay_1989  
這篇文章主要介紹了EDI中JAVA通過(guò)FTP工具實(shí)現(xiàn)文件上傳下載實(shí)例,具有一定的參考價(jià)值,有需要的可以了解一下。

最近接手一個(gè)EDI項(xiàng)目,收獲頗多。其實(shí)我在第一家公司是接觸過(guò)EDI的,當(dāng)初我們用EDI主要實(shí)現(xiàn)了訂單數(shù)據(jù)傳輸,客戶向我們下達(dá)采購(gòu)訂單,通過(guò)VPN及FTP工具將采購(gòu)訂單以約定的報(bào)文形式放到指定的文件服務(wù)器中,然后我們EDI系統(tǒng)會(huì)定時(shí)去文件服務(wù)器中獲取報(bào)文,最后解析并生成我們的銷售訂單。這些年過(guò)去了,我仍記著當(dāng)初用的最多的是EDI850、EDI855。

 一、首先介紹一下EDI的概念

Electronic data interchange,電子數(shù)據(jù)交換。

EDI其實(shí)就是把原來(lái)紙質(zhì)的訂單/發(fā)貨通知等業(yè)務(wù)單據(jù),從傳真/快遞等傳統(tǒng)方式,變成在線的電子數(shù)據(jù)方式進(jìn)行交互,從而提高業(yè)務(wù)效率。同時(shí),通過(guò)一些EDI軟件的實(shí)施配置,往往可以直接從企業(yè)的業(yè)務(wù)系統(tǒng)生成出相應(yīng)的單據(jù)數(shù)據(jù),并自動(dòng)傳送至客戶/供應(yīng)商處,實(shí)現(xiàn)Application to Application的效果,避免紙質(zhì)單據(jù)中人為造成的錯(cuò)誤(如數(shù)據(jù)錯(cuò)誤等)。所以IT系統(tǒng)完善的大公司更喜歡EDI,因?yàn)镋DI對(duì)于業(yè)務(wù)人員是透明的,業(yè)務(wù)人員操作自己日常的業(yè)務(wù)系統(tǒng)就可以了。

EDI依賴于幾個(gè)部分:

1、EDI傳輸途徑,一般EDI通過(guò)AS2協(xié)議、FTP/S等進(jìn)行直聯(lián),也可以通過(guò)第三方的VAN(增值網(wǎng))服務(wù)商中轉(zhuǎn)(這個(gè)和我們使用電子郵件的模式相同)。因?yàn)樯婕暗綐I(yè)務(wù)信息,傳輸安全要求會(huì)比較高;

2、EDI標(biāo)準(zhǔn),即業(yè)務(wù)數(shù)據(jù)的組織形式,目前最常用的美標(biāo)的ANSI X12和聯(lián)合國(guó)和歐盟的EDIFact,當(dāng)然還有很多其他標(biāo)準(zhǔn),只要EDI雙方遵循同一標(biāo)準(zhǔn),就可以很好的實(shí)現(xiàn)EDI交互;

3、兩端的EDI軟件(環(huán)境),一般最好的實(shí)現(xiàn)方式是由EDI軟件自動(dòng)收發(fā)EDI報(bào)文(數(shù)據(jù)文件),并自動(dòng)集成到企業(yè)業(yè)務(wù)系統(tǒng)中。

其中傳輸途徑中,我們采用的是FTP進(jìn)行文件傳輸?shù)?,這里我主要介紹一下Java是如何通過(guò)FTP工具進(jìn)行文件的上傳與下載,這里我們的FTP服務(wù)器是Linux操作系統(tǒng)。

二、JAVA架包引用

其中“commons-net-1.4.1.jar”、“jakarta-oro-2.0.8.jar”點(diǎn)擊鏈接均可直接下載,并且確保是可以用的,大家可以放心下載。

三、文件路徑
客戶端需要上傳的文件夾路徑"E:\edi\edi850",默認(rèn)是將該文件夾下所有文件上傳
FTP服務(wù)器端上傳路徑為“/home/test/edi850”,如果上傳為路徑則FTP服務(wù)器會(huì)建立對(duì)應(yīng)同樣的路徑

四、JAVA代碼
FTP類

package com.pcmall; 
 
public class Ftp { 
  private String ipAddr;// ip地址 
  private Integer port;// 端口號(hào) 
  private String userName;// 用戶名 
  private String pwd;// 密碼 
  private String path;// 路徑 
 
  public String getIpAddr() { 
    return ipAddr; 
  } 
 
  public void setIpAddr(String ipAddr) { 
    this.ipAddr = ipAddr; 
  } 
 
  public Integer getPort() { 
    return port; 
  } 
 
  public void setPort(Integer port) { 
    this.port = port; 
  } 
 
  public String getUserName() { 
    return userName; 
  } 
 
  public void setUserName(String userName) { 
    this.userName = userName; 
  } 
 
  public String getPwd() { 
    return pwd; 
  } 
 
  public void setPwd(String pwd) { 
    this.pwd = pwd; 
  } 
 
  public String getPath() { 
    return path; 
  } 
 
  public void setPath(String path) { 
    this.path = path; 
  } 
} 

FtpUtil類

package com.pcmall; 
 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
 
import org.apache.commons.net.ftp.FTPClient; 
import org.apache.commons.net.ftp.FTPFile; 
import org.apache.commons.net.ftp.FTPReply; 
import org.apache.log4j.Logger; 
 
public class FtpUtil { 
 
  private static Logger logger = Logger.getLogger(FtpUtil.class); 
 
  private static FTPClient ftp; 
 
  /** 
   * 獲取ftp連接 
   * 
   * @param f 
   * @return 
   * @throws Exception 
   */ 
  public static boolean connectFtp(Ftp f) throws Exception { 
    ftp = new FTPClient(); 
    boolean flag = false; 
    int reply; 
    if (f.getPort() == null) { 
      ftp.connect(f.getIpAddr(), 21); 
    } else { 
      ftp.connect(f.getIpAddr(), f.getPort()); 
    } 
    ftp.login(f.getUserName(), f.getPwd()); 
    ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 
    reply = ftp.getReplyCode(); 
    if (!FTPReply.isPositiveCompletion(reply)) { 
      ftp.disconnect(); 
      return flag; 
    } 
    ftp.changeWorkingDirectory(f.getPath()); 
    flag = true; 
    return flag; 
  } 
 
  /** 
   * 關(guān)閉ftp連接 
   */ 
  public static void closeFtp() { 
    if (ftp != null && ftp.isConnected()) { 
      try { 
        ftp.logout(); 
        ftp.disconnect(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
 
  /** 
   * ftp上傳文件 
   * 
   * @param f 
   * @throws Exception 
   */ 
  public static void upload(File f) throws Exception { 
    if (f.isDirectory()) { 
      ftp.makeDirectory(f.getName()); 
      ftp.changeWorkingDirectory(f.getName()); 
      String[] files = f.list(); 
      for (String fstr : files) { 
        File file1 = new File(f.getPath() + "/" + fstr); 
        if (file1.isDirectory()) { 
          upload(file1); 
          ftp.changeToParentDirectory(); 
        } else { 
          File file2 = new File(f.getPath() + "/" + fstr); 
          FileInputStream input = new FileInputStream(file2); 
          ftp.storeFile(file2.getName(), input); 
          input.close(); 
        } 
      } 
    } else { 
      File file2 = new File(f.getPath()); 
      FileInputStream input = new FileInputStream(file2); 
      ftp.storeFile(file2.getName(), input); 
      input.close(); 
    } 
  } 
 
  /** 
   * 下載鏈接配置 
   * 
   * @param f 
   * @param localBaseDir 
   *      本地目錄 
   * @param remoteBaseDir 
   *      遠(yuǎn)程目錄 
   * @throws Exception 
   */ 
  public static void startDown(Ftp f, String localBaseDir, 
      String remoteBaseDir) throws Exception { 
    if (FtpUtil.connectFtp(f)) { 
 
      try { 
        FTPFile[] files = null; 
        boolean changedir = ftp.changeWorkingDirectory(remoteBaseDir); 
        if (changedir) { 
          ftp.setControlEncoding("GBK"); 
          files = ftp.listFiles(); 
          for (int i = 0; i < files.length; i++) { 
            try { 
              downloadFile(files[i], localBaseDir, remoteBaseDir); 
            } catch (Exception e) { 
              logger.error(e); 
              logger.error("<" + files[i].getName() + ">下載失敗"); 
            } 
          } 
        } 
      } catch (Exception e) { 
        logger.error(e); 
        logger.error("下載過(guò)程中出現(xiàn)異常"); 
      } 
    } else { 
      logger.error("鏈接失??!"); 
    } 
 
  } 
 
  /** 
   * 
   * 下載FTP文件 當(dāng)你需要下載FTP文件的時(shí)候,調(diào)用此方法 根據(jù)<b>獲取的文件名,本地地址,遠(yuǎn)程地址</b>進(jìn)行下載 
   * 
   * @param ftpFile 
   * @param relativeLocalPath 
   * @param relativeRemotePath 
   */ 
  private static void downloadFile(FTPFile ftpFile, String relativeLocalPath, 
      String relativeRemotePath) { 
    if (ftpFile.isFile()) { 
      if (ftpFile.getName().indexOf("?") == -1) { 
        OutputStream outputStream = null; 
        try { 
          File locaFile = new File(relativeLocalPath 
              + ftpFile.getName()); 
          // 判斷文件是否存在,存在則返回 
          if (locaFile.exists()) { 
            return; 
          } else { 
            outputStream = new FileOutputStream(relativeLocalPath 
                + ftpFile.getName()); 
            ftp.retrieveFile(ftpFile.getName(), outputStream); 
            outputStream.flush(); 
            outputStream.close(); 
          } 
        } catch (Exception e) { 
          logger.error(e); 
        } finally { 
          try { 
            if (outputStream != null) { 
              outputStream.close(); 
            } 
          } catch (IOException e) { 
            logger.error("輸出文件流異常"); 
          } 
        } 
      } 
    } else { 
      String newlocalRelatePath = relativeLocalPath + ftpFile.getName(); 
      String newRemote = new String(relativeRemotePath 
          + ftpFile.getName().toString()); 
      File fl = new File(newlocalRelatePath); 
      if (!fl.exists()) { 
        fl.mkdirs(); 
      } 
      try { 
        newlocalRelatePath = newlocalRelatePath + '/'; 
        newRemote = newRemote + "/"; 
        String currentWorkDir = ftpFile.getName().toString(); 
        boolean changedir = ftp.changeWorkingDirectory(currentWorkDir); 
        if (changedir) { 
          FTPFile[] files = null; 
          files = ftp.listFiles(); 
          for (int i = 0; i < files.length; i++) { 
            downloadFile(files[i], newlocalRelatePath, newRemote); 
          } 
        } 
        if (changedir) { 
          ftp.changeToParentDirectory(); 
        } 
      } catch (Exception e) { 
        logger.error(e); 
      } 
    } 
  } 
 
  public static void main(String[] args) throws Exception { 
    Ftp ftp = new Ftp(); 
    ftp.setIpAddr("192.168.16.128"); 
    ftp.setUserName("test"); 
    ftp.setPwd("123456"); 
    FtpUtil.connectFtp(ftp); 
    File file = new File("E:/edi/edi850/");//如果是路徑則將上傳該路徑下所有文件,如果是文件則上傳該文件 
    FtpUtil.upload(file);// 把文件上傳在ftp上 
    FtpUtil.startDown(ftp, "E:/FTPTEST/", "/home/test/edi850");// 下載ftp文件測(cè)試,第二個(gè)參數(shù)為客戶端下載地址,第三個(gè)參數(shù)為文件服務(wù)器下載路徑 
    System.out.println("ok"); 
 
  } 
 
} 

上傳成功后,F(xiàn)TP文件服務(wù)器文件情況如下

下載成功后,客戶端文件如下
打開(kāi)后,文件內(nèi)容如下
好了,EDI中如何通過(guò)FTP工具進(jìn)行文件的上傳與下載先介紹到這里,以上代碼本人均親自測(cè)試,可以運(yùn)行。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 簡(jiǎn)單聊一聊Java線程池ThreadPoolExecutor

    簡(jiǎn)單聊一聊Java線程池ThreadPoolExecutor

    在使用線程池之后,開(kāi)啟線程就變成了在線程池當(dāng)中找到一個(gè)空閑的線程,銷毀線程變成了歸還線程到線程池的過(guò)程,下面這篇文章主要給大家介紹了關(guān)于Java線程池ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • java多線程-同步塊實(shí)例講解

    java多線程-同步塊實(shí)例講解

    本文主要介紹java多線程-同步塊的知識(shí),這里整理了相關(guān)的詳細(xì)資料及簡(jiǎn)單示例代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • 解讀classpath讀取resources目錄下的文件

    解讀classpath讀取resources目錄下的文件

    這篇文章主要介紹了解讀classpath讀取resources目錄下的文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Spring中SmartLifecycle的用法解讀

    Spring中SmartLifecycle的用法解讀

    這篇文章主要介紹了Spring中SmartLifecycle的用法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 一文帶你深入了解Java中延時(shí)任務(wù)的實(shí)現(xiàn)

    一文帶你深入了解Java中延時(shí)任務(wù)的實(shí)現(xiàn)

    延時(shí)任務(wù)相信大家都不陌生,在現(xiàn)實(shí)的業(yè)務(wù)中應(yīng)用場(chǎng)景可以說(shuō)是比比皆是。這篇文章主要為大家介紹幾種實(shí)現(xiàn)延時(shí)任務(wù)的辦法,感興趣的可以了解一下
    2022-11-11
  • 如何使用ThreadLocal上下文解決查詢性能問(wèn)題

    如何使用ThreadLocal上下文解決查詢性能問(wèn)題

    這篇文章主要介紹了利用ThreadLocal上下文解決查詢性能問(wèn)題,有兩種解決方案,一種是使用ThreadLocal上下文,另一種是使用Redis緩存,需要的朋友可以參考下
    2023-07-07
  • Intellij IDEA神器居然還有這些小技巧

    Intellij IDEA神器居然還有這些小技巧

    Intellij IDEA真是越用越覺(jué)得它強(qiáng)大,它總是在我們寫(xiě)代碼的時(shí)候,不時(shí)給我們來(lái)個(gè)小驚喜,本文給大家主要介紹一些你可能不知道的但是又實(shí)用的小技巧,感興趣的朋友跟隨小編一起看看吧
    2021-01-01
  • Java內(nèi)存溢出案例模擬和原理分析過(guò)程

    Java內(nèi)存溢出案例模擬和原理分析過(guò)程

    這篇文章主要介紹了Java內(nèi)存溢出案例模擬和原理分析過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 一文詳解如何使用Java來(lái)發(fā)送qq郵箱郵件

    一文詳解如何使用Java來(lái)發(fā)送qq郵箱郵件

    這篇文章主要給大家介紹了關(guān)于如何使用Java來(lái)發(fā)送qq郵箱郵件的相關(guān)資料,文中降了準(zhǔn)備工作(開(kāi)啟服務(wù)并生成授權(quán)碼)、接口調(diào)用(引入依賴和編寫(xiě)接口代碼)、發(fā)送HTML格式郵件等內(nèi)容,需要的朋友可以參考下
    2024-12-12
  • Spring中的Aware接口及應(yīng)用場(chǎng)景詳解

    Spring中的Aware接口及應(yīng)用場(chǎng)景詳解

    這篇文章主要介紹了Spring中的Aware接口及應(yīng)用場(chǎng)景,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

瓦房店市| 元阳县| 祁连县| 平罗县| 平江县| 尼勒克县| 乐山市| 辽中县| 婺源县| 丹棱县| 台北县| 怀来县| 阿尔山市| 连江县| 大余县| 奉新县| 兴化市| 鲁山县| 老河口市| 开封县| 信宜市| 余干县| 涡阳县| 双牌县| 平邑县| 额尔古纳市| 比如县| 淮阳县| 固安县| 红河县| 静乐县| 科尔| 公安县| 织金县| 德安县| 临安市| 赫章县| 大化| 民权县| 志丹县| 天台县|