2010-03-13 2 views
3

Ненавижу генерировать исключение для вещей, которые я могу просто проверить с помощью оператора if. Я знаю, что zip/jar с нулевой длиной вызовет исключение, если вы попытаетесь получить к нему доступ, используя API java.util.zip/java.util.jar. Таким образом, кажется, что должен быть самый маленький файл, с которым могут работать эти API-интерфейсы.Что такое самый маленький, юридический файл zip/jar?

ответ

2

Согласно ZIP формата файл specs почтового файл должны по крайней мере иметь центральную структуру каталогов, которая составляет 46 байт длины +-переменных полей (проверить спецификацию самостоятельно).

Возможно, мы должны принять по крайней мере 1 запись, которая подразумевает заголовок файла для этой записи.

+1

(PlugIn/WebStart отклонит любой zip/jar, который не начинается с магического номера заголовка записи (для защиты от GIFAR).) –

+3

Нет, самый маленький юридический/действительный почтовый файл - 22 байта: '80 75 05 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00. Однако я не знаю о файлах jar. – Cheeso

+0

@Cheeso, не zip, который должен начинаться с 'PK' ... wherease' 80 75' не так ...: S –

3

Вы действительно должны поставить этот код в try/catch, поскольку есть много вещей, которые могут пойти не так, когда вы читаете/записываете файлы?

Если вы действительно должны знать ответ на этот вопрос, попробуйте добавить 1-байтовый файл в zip-файл, а затем посмотреть, не получилось ли это? Легкий код проходит через диапазон размеров от 1 до 65536 байт и добавляет в zip-файл и видит, какие из них терпят неудачу?

+1

Код находится в блоке try/catch. Я не люблю писать код, который использует исключения, чтобы поймать условие, которое можно тестировать. – vkraemer

+1

Ваш код должен быть действительно дерьмовым, если вы считаете, что проверка размера zip - это enuff, и ничто другое не может быть неправильным. Пусть zip-классы выполняют свою задачу и позволяют им жаловаться через исключение. –

2

Jar файлы должны иметь хотя бы одну запись. Если вы хотите сделать пустой, сделайте манифест только банкой.

См. http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html#JAR Манифест для получения дополнительной информации о манифестовых банках.

+0

Итак, кажется, что самый маленький юридический zip-файл будет меньше, чем самая маленькая юридическая банка? – vkraemer

0

Самый маленький юридический почтовый индекс содержит нулевые записи и один «пустой» центральный каталог.

байты:

80 75 05 06 

следуют 18 байт ноль (0).

Итак, длина 22 байт.

VBscript создать его:

Sub NewZip(pathToZipFile) 

    WScript.Echo "Newing up a zip file (" & pathToZipFile & ") " 

    Dim fso 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Dim file 
    Set file = fso.CreateTextFile(pathToZipFile) 

    file.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, 0) 
    file.Close 

    Set fso = Nothing 
    Set file = Nothing 
    WScript.Sleep 500 
End Sub 


NewZip "Empty.zip" 
+0

Это может работать для zip-программы, но, похоже, это неприемлемо для java.util.zip. * Apis. – vkraemer

1

Я написал быстрый тест и наименьшую молнию, что я мог бы создать и затем считаны с API, java.util.zip был 118 байт. Возможно, существует способ создания меньшего zip-файла, который соответствует спецификации и читается с помощью утилиты zip ...

0
final static byte[] EmptyZip={80,75,05,06,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00}; 
public static void createEmptyZip(String path){ 
    try{ 
     FileOutputStream fos=new FileOutputStream(new File(path)); 
     fos.write(EmptyZip, 0, 22); 
     fos.flush(); 
     fos.close(); 
    }catch (FileNotFoundException e){ 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
Смежные вопросы