Вопрос

У меня есть приложение, написанное на Java, которое использует файл jar (оно использует более одного, но это не главное).

Дело в том, что файл Jar, который я использую, содержит файлы, которые я ОБЯЗАН извлечь в файловую систему.

До сих пор я использую Class.getResourceAsStream и FileOutputStream, но этот метод несколько медленный.Обратите внимание, что некоторые из этих файлов являются текстовыми, а другие — просто двоичными.

Итак, помимо попыток уменьшить необходимость извлечения файлов из JAR-файлов, существуют ли какие-либо оптимизации (например, более адекватные функции) для этих задач.

Обратите внимание, что мое приложение основано на Java 6, и я хотел бы свести внешние зависимости к минимуму.

РЕДАКТИРОВАТЬ:Для дальнейшего использования мой СТАРЫЙ(неэффективный) код был:

int c;
while((c = is.read())!=-1){
    fos.write(c);
}

О новом, гораздо более быстром коде см. принятый ответ.

Это было полезно?

Решение

У вас есть контроль над файлом jar? Если вы создадите его без сжатия, это может сделать его быстрее. Очевидно, это увеличит размер файла JAR ...

Еще одна вещь, которую нужно проверить - как вы распаковываете файл? Например, если вы делаете это побайтово, это будет мучительно медленно. Используйте что-то вроде этого:

public static void copyStream(InputStream input, OutputStream output)
     throws IOException
{
    // Reads up to 8K at a time. Try varying this.
    byte[] buffer = new byte[8192];
    int read;

    while ((read = input.read(buffer)) != -1)
    {
        output.write(buffer, 0, read);
    }
}

Если вы уже делаете это, не могли бы вы дать нам больше информации? Насколько медленно "несколько медленно"? Как это сравнить, скажем, с использованием утилиты jar для извлечения файла jar?

Другие советы

Эрр.Я не уверен, что вы на самом деле хотите сделать, но думали ли вы об использовании Winzip?

Очевидно, что если вам нужно динамически извлекать файлы во время выполнения, это не сработает - но я не уверен, зачем вам это нужно - как часто этот файл jar меняется?

Конечно, вы можете извлечь их один раз, а затем распространить вместе с приложением?

Я согласен с Джоном. 2 вещи сделают извлечение быстрее:

<Ол>
  • Снижение уровня сжатия.
  • Увеличение размера буфера, используемого при копировании / извлечении.
  • Я предполагаю, что необходимость распаковывать связана с требованием записи / перечитывания из файла. Если файлы достаточно малы, память достаточно велика, и постоянный характер файлов не является обязательным; Вы могли бы рассмотреть отображение всего ресурса в память вместо использования диска в качестве хранилища.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top