Java: проверить файл TAR - PullRequest
3 голосов
/ 09 марта 2012

Можно ли проверить файл tar на Java, чтобы я мог быть уверен, что другие утилиты tar (т.е. команда tar UNIX) могут извлечь tar? Я хотел бы сделать это в коде и не прибегать к фактическому выполнению tar -tf из моего приложения и отчета на основе кода возврата.

Я использовал сжатие Apache commons для чтения записей tars (а не их извлечения). Я вручную изменил некоторые из tar с помощью текстового редактора, чтобы представить «поврежденный» tar-файл. Сжатие Commons не всегда не в состоянии прочитать записи, где как команда tar UNIX или 7zip постоянно терпели неудачу независимо от того, что я изменяю. Очевидно, что нужно сделать еще кое-что, чтобы убедиться, что файл tar не поврежден, но что это?

Примечание: На самом деле я не пытался извлечь tar с помощью обычного сжатия в качестве средства проверки. Я не думаю, что это действительно вариант; Размеры tar-файлов, с которыми мне приходится работать, большие (от 3 до 4 гигабайт), и я бы предпочел, чтобы этот процесс не занимал больше времени, чем это уже происходит.

1 Ответ

0 голосов
/ 09 марта 2012

Поскольку вы не хотите выполнять команду tar, вы можете использовать org.apache.tools.tar.TarInputStream реализацию Apache ANT .

Лично я не пробовал, и я не являюсь экспертом в формате TAR , но я бы попробовал перебрать файл TAR, используя метод getNextEntry. Предполагая, что, как только вы закончите со всеми без ошибок / исключений, вы (в некоторой степени) доказали, что файл TAR является «допустимым».

ОБНОВЛЕНИЕ : На самом деле на приведенной выше странице Википедии перечислены следующие реализации Java:

Jtar включает в себя пример распаковки файла TAR, который, я думаю, можно изменить, чтобы просто "проверить" архив.

   String tarFile = "c:/test/test.tar";

   // Create a TarInputStream
   TarInputStream tis = new TarInputStream(new BufferedInputStream(new FileInputStream(tarFile)));
   TarEntry entry;
   while((entry = tis.getNextEntry()) != null) {

      System.out.println(entry.getName());

      // The following might not be required, but arguably does 
      // additionally check the content of the archive.
      int count;
      byte data[] = new byte[2048];

      while((count = tis.read(data)) != -1) {
      }
   }

   tis.close();
...