当前位置: 首页 > 知识库问答 >
问题:

Java:从FTP下载. zip文件并提取内容,而不将文件保存在本地系统上

商璞
2023-03-14

我有一个要求,我需要下载某些。从FTP服务器压缩文件,并将存档的内容(内容是一些XML文件)推送到HDFS(Hadoop分布式文件系统)。因此,到目前为止,我正在使用acpache FTPClient连接到FTP服务器,并首先将文件下载到本地计算机。稍后将其解压缩,并给出一个方法的文件夹路径,该方法将迭代本地文件夹并将文件推送到HDFS。为了便于理解,我还在下面附加了一些代码片段。

 //Gives me an active FTPClient
    FTPClient ftpCilent = getActiveFTPConnection();
    ftpCilent.changeWorkingDirectory(remoteDirectory);

    FTPFile[] ftpFiles = ftpCilent.listFiles();
    if(ftpFiles.length <= 0){
    logger.info("Unable to find any files in given location!!");
    return;
    }
    //Iterate files
    for(FTPFile eachFTPFile : ftpFiles){
        String ftpFileName = eachFTPFile.getName();

        //Skips files if not .zip files
        if(!ftpFileName.endsWith(".zip")){
           continue;
        }

    System.out.println("Reading File -->" + ftpFileName);
    /*
     * location is the path on local system given by user
     * usually loaded by a property file.
     *
     * Create a archiveLocation where archived files are
     * downloaded from FTP.
     */
    String archiveFileLocation = location + File.separator + ftpFileName;
    String localDirName = ftpFileName.replaceAll(".zip", "");
    /*
     * localDirLocation is the location where a folder is created
     * by the name of the archive in the FTP and the files are copied to
     * respective folders.
     *
     */
    String localDirLocation = location + File.separator + localDirName;
    File localDir = new File(localDirLocation);
    localDir.mkdir();

    File archiveFile = new File(archiveFileLocation);

    FileOutputStream archiveFileOutputStream = new FileOutputStream(archiveFile);

    ftpCilent.retrieveFile(ftpFileName, archiveFileOutputStream);
    archiveFileOutputStream.close();

    //Delete the archive file after coping it's contents
    FileUtils.forceDeleteOnExit(archiveFile);

    //Read the archive file from archiveFileLocation.       
    ZipFile zip = new ZipFile(archiveFileLocation);
    Enumeration entries = zip.entries();

    while(entries.hasMoreElements()){
    ZipEntry entry = (ZipEntry)entries.nextElement();

    if(entry.isDirectory()){
        logger.info("Extracting directory " + entry.getName());
        (new File(entry.getName())).mkdir();
        continue;
    }

    logger.info("Extracting File: " + entry.getName());
    IOUtils.copy(zip.getInputStream(entry), new FileOutputStream(
    localDir.getAbsolutePath() + File.separator + entry.getName()));
    }

    zip.close();
   /*
    * Iterates the folder location provided and load the files to HDFS
    */    
    loadFilesToHDFS(localDirLocation);
    }
    disconnectFTP();

现在,这种方法的问题是,该应用程序需要花费大量时间将文件下载到本地路径,解压缩后再加载到HDFS。有没有更好的方法可以动态地从FTP提取Zip的内容,并将内容流直接提供给方法loadFilesToHDFS(),而不是本地系统的路径?

共有1个答案

刘成礼
2023-03-14

使用zip流。请参见此处:http://www.oracle.com/technetwork/articles/java/compress-1565076.html

具体请参见此处的代码示例1。

 类似资料:
  • 我有一个问题,连接两个不同的进程,我正在工作。我的任务是从数据库中提取数据,从数据中创建一个文件,然后将其上传到FTP服务器。 到目前为止,我已经使用以下代码创建并下载了文件,是包含完整文本文件的字符串: 当我只想在浏览器中运行脚本并下载文件,但我希望将其发送到FTP服务器时,这会起作用。 我知道我与FTP服务器的连接正常工作,并且我正确地导航到正确的目录,并且我已经从磁盘中提取了文件并使用将它们

  • 问题内容: 我正在尝试创建一个简单的Java程序,该程序从zip文件中的文件读取和提取内容。压缩文件包含3个文件(txt,pdf,docx)。我需要阅读所有这些文件的内容,并且为此使用了Apache Tika。 有人可以帮我实现此功能。到目前为止,我已经尝试过了,但是没有成功 代码段 问题答案: 如果你想知道如何从每个文件中获取文件内容,ZipEntry那实际上很简单。这是一个示例代码: 一旦拥有

  • 问题内容: 我有使用Spark生成的RDD。现在,如果我将此RDD写入csv文件,则可以使用“ saveAsTextFile()”之类的一些方法,该方法将csv文件输出到HDFS。 我想将文件写入本地文件系统,以便我的SSIS进程可以从系统中选择文件并将它们加载到DB中。 我目前无法使用sqoop。 除了编写Shell脚本之外,Java中是否还有其他地方可以做到这一点? 需要任何清晰度,请告知。

  • 我必须构建一个简单的路由,用camel将文件从ftps服务器下载到我的文件系统,所以我要做以下操作: 在日志中,我没有看到任何错误,路由似乎已正确初始化(我确信文件就在那里:)): 这是我在filezilla上连接到ftps服务器的设置,它正在工作 如果我尝试连接到一个普通的ftp服务器,那么路由就会很好地工作。 有人帮忙吗?

  • 我试图构建一个简单的路由,从FTP文件夹读取,并将其存储在本地资源文件夹中。我能够连接到FTPendpoint,但之后什么也不会发生。 要启动我的程序,我使用:mvn clean compile camel:run

  • 问题内容: 我正在尝试使用Python 2.7.1(在Windows上,fyi)从zip文件中提取文件,而我的每一次尝试都显示了具有Modified Date =提取时间的提取文件(不正确)。 我也尝试使用.extractall方法,结果相同。 谁能告诉我我在做什么错? 我想认为这是可能的,而不必重新校正每个[Windows文件的文件创建日期?](http://codingdict.com/que