2009-06-20 4 views
1

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

Дело в том, что файл Jar, который я использую, содержит файлы, которые я абсолютно ДОЛЖЕН извлечь в файловую систему.

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

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

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

EDIT: На будущем, мой OLD (inefficent) код был:

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

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

ответ

7

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

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

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?

+0

Я действительно копировал byte by byte! Теперь это значительно быстрее! Благодаря! – luiscubal

1

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

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

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

0

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

  1. Снижение уровня сжатия.
  2. Увеличение размера буфера, используемого при копировании/извлечении.

Я предполагаю, что необходимость извлечь из-за требования написать/перечитать из файла. Если файлы достаточно малы, объем памяти достаточно велик, и постоянный характер файлов не является обязательным требованием; вы можете рассмотреть возможность сопоставления всего ресурса в памяти вместо использования диска в качестве хранилища.

+0

Файл составляет около 165 КБ. Ящик сжат, так как NetBeans выводит его. – luiscubal

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

  • Нет связанных вопросов^_^