¿Como leer archivos dentro de un jar?

publicado por: Anonymous

Estoy haciendo un splash que tiene una JProgressBar que va avanzando a medida que cuenta los archivos de la carpeta resources, funciona bien en el IDE pero al pasarlo a Jar no funciona.

path es la direccion en este caso

/res/

y paths es el ArrayList donde se guardan

public static void readFile(String path, ArrayList<String> paths) {
    File file = null;
    try {
        file = new File(Utilities.class.getResource(path).toURI());
    } catch (URISyntaxException e) {
    }
    if (file != null && file.exists()) {
        fileViewer(file, paths);
    }
}

Sé que para leer de un Jar hay que usar el metodo getResoucesAsStream(String) el problema esta en que no se como implementarlo ya que luego utilizo otro metodo para obtener las direcciones de los resources

public static void fileViewer(File file, ArrayList<String> paths) {
    if (file.isDirectory()) {
        for (File f : file.listFiles()) {
            fileViewer(f, paths);
        }
    } else {
        paths.add(file.getPath());
    }
}

Funciona de la manera deseada IDE pero cuando genero el jar no es el resultado deseado

¿Como podria hacer para que funcione desde el jar?

solución

Al día actual la versión más actual de Java es la 11 que por el comentario que haz puesto es la que utilizas.

Partiendo de este dato te coloco mi sugerencia para realizar lo que necesitas. No sin antes mencionar que un jar es en realizad un archivo comprimido en formato ZIP.

Por tanto mi propuesta es que se utilize la clase ZipInputStream que es la que puede leer el contenido de un archivo en formato Zip.

package mx.net.alvatroz.lecturajar;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.CodeSource;
import java.util.ArrayList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 *
 * @author Alvaro C
 */
public class Main {

   public static void main(String[] args) throws IOException, URISyntaxException {


      CodeSource src = Main.class.getProtectionDomain().getCodeSource();
      ArrayList<String> paths = new ArrayList<>();

      System.out.println("Las fuentes estan en: " + src);

      if (src != null) {
     URL jar = src.getLocation();

     System.out.println("Las fuentes estan en: " + src.getLocation());

     // si estamos en un jar leemos su contenido
     if ( jar.getPath().endsWith("jar")) {

        ZipInputStream zip = new ZipInputStream(jar.openStream());

        while (true) {
           ZipEntry e = zip.getNextEntry();
           if (e == null) {
          break;
           }           
           paths.add(e.getName());


        }
     } else {
        // si no estamos en el jar usamos la rutina que ya tienes
        fileViewer(new File(jar.toURI()), paths);
     }

      } else {
         System.out.println("No se pudo obtener el punto desde donde se ejecuta el código");
      }

      System.out.println("Las rutas son:  " + paths);
   }



   public static void fileViewer(File file, ArrayList<String> paths) {
      if (file.isDirectory()) {
     for (File f : file.listFiles()) {
        fileViewer(f, paths);
     }
      } else {
     paths.add(file.getPath());
      }
   }

}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *