Я пытаюсь записать функцию, которая примет InputStream
с заархивированными данными файла и возвратил бы другого InputStream
с разархивированными данными.
Заархивированный файл будет только содержать единственный файл и таким образом нет никакого требования создания каталогов и т.д...
Я пытался смотреть на ZipInputStream
и другие, но я смущен таким количеством различных типов потоков в Java.
Концепции
GZIPINPUTSTREAM предназначены для потоков (или файлов), нажимых как GZIP («.gz» расширение). У него нет информации заголовка.
GZIPINPUTSTREAM предназначен для [ZAPTATATA]
Если у вас есть настоящий zip-файл, вам нужно пользовательский zipfile, чтобы открыть файл, попросить список файлов (один в своем примере) и попросить распакованный входной поток.
ZIPFile для файла с [Информацией заголовка + ZaincData]
Ваш метод, если у вас есть файл, было бы что-то вроде:
// ITS PSEUDOCODE!!
private InputStream extractOnlyFile(String path) {
ZipFile zf = new ZipFile(path);
Enumeration e = zf.entries();
ZipEntry entry = (ZipEntry) e.nextElement(); // your only file
return zf.getInputStream(entry);
}
чтение ввода с содержимым файла .zip
Если у вас есть входной потерю, вы можете использовать (как @Cletus говорит) zipinputStream. Он читает поток, включающий данные заголовка.
ZIPINPUTSTREAM предназначен для потока с [Информация о заголовке + ZippedData]
Важно: если у вас есть файл на вашем компьютере, вы можете использовать ZipFile
класс для доступа к нему случайным образом
Это образец Чтение zip-файла через входную систему:
import java.io.FileInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class Main {
public static void main(String[] args) throws Exception
{
FileInputStream fis = new FileInputStream("c:/inas400.zip");
// this is where you start, with an InputStream containing the bytes from the zip file
ZipInputStream zis = new ZipInputStream(fis);
ZipEntry entry;
// while there are entries I process them
while ((entry = zis.getNextEntry()) != null)
{
System.out.println("entry: " + entry.getName() + ", " + entry.getSize());
// consume all the data from this entry
while (zis.available() > 0)
zis.read();
// I could close the entry, but getNextEntry does it automatically
// zis.closeEntry()
}
}
}
Если вы можете изменить данные ввода, я бы предложил вам использовать gzipinputStream
.
GZIPINPUTSTREAM
отличается от ZipinputStream
, поскольку у вас есть только один данные внутри него. Таким образом, весь входной поток представляет весь файл. В ZipinputStream
Весь поток содержит также структуру файла внутри него, что может быть много.
Если я чего-то не хватает, вы должны абсолютно попробовать и получить zipinputStream
на работу, и нет причин. ).
Что вы должны сделать, это попробовать и получить ZipinputStream
для работы, и если вы не можете, опубликовать код, и мы поможем вам с любыми проблемами, которые у вас есть.
Что бы вы ни делали, не пытайтесь изобретать его функциональность.