BZip2 - что нужно передать в FileOutputstream для разных типов файлов

Я пытаюсь извлечь файл bz2, как упомянуто ниже, это тестовый класс, который я написал, и я знаю, что это файл.txt в несжатом виде, но когда я действительно читаю его с сервера, несжатый файл bz2 может быть что-то вроде html, tar,tgz или текстовые файлы, как мне сделать этот код универсальным, чтобы он работал для любого типа файла.

Я хочу распаковать разные файлы, если это test.txt.bz2, а затем распаковать в test.txt и 6223.webvis.html_20130803195241.bz2 в 6223.webvis.html_20130803195241. Как я могу сделать мой код универсальным, чтобы он работал для этих двух разных сценариев.

try{
FileInputStream fin = new FileInputStream("C:\\temp\\test.txt.bz2");
BufferedInputStream in = new BufferedInputStream(fin);
FileOutputStream out = new FileOutputStream("C:\\temp\\test.txt");
BZip2CompressorInputStream bzIn = new BZip2CompressorInputStream(in);
int buffersize = 1024;
final byte[] buffer = new byte[buffersize];
int n = 0;
while (-1 != (n = bzIn.read(buffer))) {
out.write(buffer, 0, n);
}
out.close();
bzIn.close();
}
catch (Exception e) {
throw new Error(e.getMessage());
}
}

Спасибо, Акшита.

2 ответа

Решение

Архив BZ2 ничего не знает об оригинальном названии. Обычный способ сделать это, чтобы сжать file.ext как file.ext.bz2, так что вы получите имя выходного файла из имени архива.

String inFile = "test.bz2";
String outFile = inFile.substring(0, inFile.length() - 4);
// outFile == "test"

Обычным шаблоном является файл с именем x, который сохраняется как x.bz2, поэтому имя выходного файла - это имя входного файла с удаленными последними четырьмя символами. Единственное известное исключение - x.tar -> x.tbz (но некоторые люди используют x.tar.bz2).

Это означает, что ваш пример не следует нормальному образцу; в противном случае это будет test.txt.bz2.

Другие вопросы по тегам