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.