【问题标题】:Get InputStream out of TarArchiveInputStream从 TarArchiveInputStream 中获取 InputStream
【发布时间】:2018-11-23 09:52:57
【问题描述】:

我正在从 FTP 获取文件。 我得到的文件是文本文件或 tar.gz

对于文本文件,我只是将它们发送到 S3。如果遇到 tar.gz,我想解压它并用相同的方法保存每个文件。

public void handleFile() {

    try (InputStream fileStream = ftpFileService.getInputStream(file)) {
        if (file.getName().lastIndexOf(".TGZ") > -1) {
            TarArchiveInputStream tar = new TarArchiveInputStream(new GzipCompressorInputStream(fileStream));
            TarArchiveEntry entry = null;
            while ((entry = tar.getNextTarEntry()) != null) {
                LOGGER.info("fileName to save {}", entry.getName());
                saveStreamToS3(entry.getName(), new InputStream(tar));
            }
            tar.close();
        } else {
            LOGGER.info("fileName to save {}", fileName.getName());
            saveStreamToS3(fileName.getName(), fileStream);
        }
    } catch (IOException e) {
        LOGGER.error(e.getMessage());
    }
}

我尝试使用new FileInputStream(entry.getFile()) 直接保存entry,但这会返回null。

我需要创建一个saveTarStreamToS3() 还是可以从 TarArchiveInputStream 中创建一个 InputStream?

【问题讨论】:

    标签: java amazon-s3 apache-commons-compress


    【解决方案1】:

    FileInputStream 只读取真实文件。它不会从存档中读取数据。

    有两种可能的解决方案

    • 使用 InputStream 哪个 FileInputStream 和 TarArchiveInputStream 隐含
    • 将文件复制到磁盘,使用 FileInputStream 读取,然后删除。

    InputStream 界面的目的是让你不需要知道数据来自哪里,这是解决这个问题的自然方法。

    我可以从 TarArchiveInputStream 中创建一个 InputStream

    TarArchiveInputStream 实现了 InputStream 所以没有什么可做的。

    【讨论】:

    • @gyc 你在向上转换时不需要转换它。您只需要在向下转换时进行转换,例如(TarArchiveInputStream) inputStream 需要演员表。
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2014-04-08
    • 2014-01-06
    • 1970-01-01
    • 2010-10-20
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多