Pregunta

Tengo una aplicación escrita en Java que usa un archivo jar (usa más de uno, pero ese no es el punto).

El hecho es que el archivo Jar que estoy usando contiene archivos que DEBO extraer absolutamente al sistema de archivos.

Hasta ahora estoy usando Class.getResourceAsStream y FileOutputStream, pero este método es algo lento. Tenga en cuenta que algunos de estos archivos están basados ??en texto, pero otros son simplemente binarios.

Entonces, además de tratar de reducir la necesidad de extraer archivos de JAR, ¿hay optimizaciones (como funciones más adecuadas) para estas tareas?

Tenga en cuenta que mi aplicación está basada en Java 6 y me gustaría reducir al mínimo las dependencias externas.

EDITAR: para referencia futura, mi código ANTERIOR (ineficaz) era:

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

Para el nuevo código, mucho más rápido, consulte la respuesta aceptada.

¿Fue útil?

Solución

¿Tienes control sobre el archivo jar? Si lo crea sin comprimir, puede hacerlo más rápido. Obviamente, hará que el archivo jar sea más grande ...

Otra cosa para verificar: ¿cómo extrae el archivo? Por ejemplo, si lo haces byte a byte, será dolorosamente lento. Use algo como esto:

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);
    }
}

Si ya está haciendo esto, ¿podría darnos más información? ¿Qué tan lento es " algo lento " ;? ¿Cómo se compara con, digamos, el uso de la utilidad jar para extraer el archivo jar?

Otros consejos

Err. No estoy seguro de lo que realmente quieres hacer, pero ¿has pensado en usar winzip?

Obviamente, si necesita extraer los archivos dinámicamente en tiempo de ejecución, esto no funcionará, pero no estoy seguro de por qué necesitaría hacer esto, ¿con qué frecuencia cambia este archivo jar?

¿Seguramente puede extraerlos una vez y luego distribuirlos con la aplicación?

Estoy de acuerdo con Jon. 2 cosas harán que la extracción sea más rápida:

  1. Disminución del nivel de compresión.
  2. Aumentar el tamaño del búfer utilizado al copiar / extraer.

Supongo que la necesidad de extraer se debe al requisito de escribir / releer del archivo. Si los archivos son lo suficientemente pequeños, la memoria es lo suficientemente grande y la naturaleza persistente de los archivos no es un requisito; puede considerar asignar todo el recurso a la memoria en lugar de usar el disco como almacenamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top