Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从TarArchiveInputStream中获取InputStream_Java_Amazon S3_Apache Commons Compress - Fatal编程技术网

Java 从TarArchiveInputStream中获取InputStream

Java 从TarArchiveInputStream中获取InputStream,java,amazon-s3,apache-commons-compress,Java,Amazon S3,Apache Commons Compress,我正在从FTP获取文件。 我得到的文件不是文本文件就是tar.gz 对于文本文件,我只将它们发送到S3。如果我遇到一个tar.gz,我想解压它并用相同的方法保存每个文件 public void handleFile() { try (InputStream fileStream = ftpFileService.getInputStream(file)) { if (file.getName().lastIndexOf(".TGZ") > -1) {

我正在从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.getFile())
保存
条目
,但返回空值


我是否需要制作一个
saveTarStreamToS3()
,或者我可以从一个TarArchiveInputStream制作一个InputStream?

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

有两种可能的解决办法

  • 使用
    InputStream
    哪个文件InputStream和TarArchiveInputStream实现
  • 将文件复制到磁盘,使用FileInputStream读取,然后删除
接口
InputStream
的目的是不需要知道数据来自何处,这是解决这个问题的自然方法

我可以从TarArchiveInputStream生成InputStream吗


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

@gyc您不需要在向上投射时投射它。您只需要在向下转换时转换它,例如,
(TarArchiveInputStream)inputStream
需要转换。