Конструктор ZipFile - правильный способ использования аргументов mode и charset - PullRequest
0 голосов
/ 02 июля 2019

Здесь - это ZipFile конструктор

 ZipFile(File file, int mode, Charset charset) throws IOException

Как точно используются аргументы mode и charset?Для чего они нужны?

1) mode = ZipFile.OPEN_DELETE

Когда файл удален?

Кроме того, это не удаление отдельных файлов в zip-архиве - почему бы мне просто не удалить свой zip-файл, используя File.delete() или File.deleteOnExit()?

Файл будет удален некоторое время между моментом его открытия и моментом его закрытия, но его содержимое будет оставаться доступным через объект ZipFile, пока не будет вызван метод close или методвыход из виртуальной машины.

Поэтому я удаляю файл, подобный следующему:

try {

    ZipFile zf = new ZipFile(new File("myZipFile.zip"), ZipFile.OPEN_DELETE);           

    // file name and comment are not read in this binary stream, do they?
    zf.getInputStream(zf.getEntry("dirInZip/fileInsideZip.txt"));
    // some operations

    zf.close(); // closes InputStream and deletes myZipFile.zip ?

} catch (IOException e) {
    // handling
}

2) Аргумент Charset:

Кодировка, которая будет использоваться длярасшифровывать имя записи ZIP и комментарий (игнорируется, если установлен бит кодирования языка флага бит общего назначения записи ZIP).

Я его вообще не понимаю.

Перед запуском какой-либо утилиты zip имена файлов (для архивирования) могут быть в кодировке не-UTF (теоретически в очень старых Windows это может быть кодовая страница Windows-1252 и т. Д.), Кроме того, когда я запускаю WinZip иличто-то, что я могу скопировать и вставить не-UTF-текст в качестве комментария - но разве не существует какого-то стандарта, как имена файлов и комментарии должны храниться в ZIP (я имею в виду WinZip или что-то подобное, чтобы принудительно / изменить кодировку на UTF-8 перед архивированием)?

2.1) В каком случае я мог бы ожидать имена файлов не-UTF и комментарии в Zip?

2.2) Использование myZipFile.getEntry ("dirInZip / fileInsideZip.txt") Я использую строку Java, которая является UTF16по сути, так почему я должен заботиться о кодировании?Я просто пишу что угодно в строку Java, верно?

1 Ответ

1 голос
/ 03 июля 2019

Я думаю 1) достаточно ясно: файл в какой-то момент удален, но все еще доступен, потому что загружен в память.Что в этом неясного?

Re 2), при чтении текста из внешнего источника необходимо знать его кодировку и использовать эту кодировку для декодирования текста.В действительности то, что вы читаете, является двоичным потоком, поэтому необходимо знать метод, используемый для кодирования исходных символов.Как вы затем сохраните этот текст (например, Java UTF-16) - это следующий шаг.

...