我正在从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());
    }
}


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

我需要制作saveTarStreamToS3()还是可以用TarArchiveInputStream制作InputStream?

最佳答案

FileInputStream仅读取真实文件。它不会从存档内部读取数据。

有两种可能的解决方案


使用InputStream表示FileInputStream和TarArchiveInputStream的含义
将文件复制到磁盘,使用FileInputStream读取,然后删除。


接口InputStream的目的是让您无需知道数据来自何处,这是解决此问题的自然方法。


  我可以用TarArchiveInputStream制作InputStream吗


TarArchiveInputStream实现InputStream,因此无需执行任何操作。

10-06 07:07