Получить InputStream из TarArchiveInputStream - PullRequest
0 голосов
/ 23 ноября 2018

Я получаю файлы с 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()), но это возвращает ноль.

Нужно ли сделать saveTarStreamToS3() или я могу создать InputStream из TarArchiveInputStream?

1 Ответ

0 голосов
/ 23 ноября 2018

FileInputStream читает только реальные файлы.Он не считывает данные из архива.

Существует два возможных решения

  • Использование InputStream, которые подразумевают FileInputStream и TarArchiveInputStream
  • Скопируйте файл вдиск, прочитайте с помощью FileInputStream, затем удалите.

Цель интерфейса InputStream в том, чтобы вам не нужно было знать, откуда поступают данные, и это естественный способ решитьthis.

Могу ли я сделать InputStream из TarArchiveInputStream

TarArchiveInputStream реализует InputStream, поэтому ничего не нужно делать.

...