2012-03-02 23 views
5

Tengo un archivo jar, que contiene varias carpetas como imágenes, fuentes, mensajes, etc. ... Tengo que leer todos los archivos dentro de la carpeta de fuente solamente.Leer archivos de una carpeta dentro de un archivo jar

Actualmente, mi código de Java está iterando a través de todos los contenidos en el archivo jar. Mi código es el siguiente:

private void loadApplicationSpecificFonts() { 
     try{ 
       JarFile jarFile = new JarFile("owenstyle-jar-config.jar"); 
      JarEntry entry; 
       String fontName; 

    for(Enumeration em = jarFile.entries(); em.hasMoreElements();) { 
        String s= em.nextElement().toString(); 
        if(s.endsWith("ttf")){ 
         fontName= s.substring(s.lastIndexOf("/")+1); 
         fontName= fontName.substring(0, fontName.indexOf(".ttf")); 
         entry = jarFile.getJarEntry(s); 
         InputStream input = jarFile.getInputStream(entry); 
         Font font= Font.createFont(Font.TRUETYPE_FONT, input); 
         GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
         ge.registerFont(font); 

         input.close(); 
       } 
    } 
      jarFile.close(); 
     }catch (IOException e){ 
      System.err.println("Error: " + e.getMessage()); 
     }catch (FontFormatException e){ 
      System.err.println("Error: " + e.getMessage()); 
     } 
    } 

¿Hay una manera que puedo dar a la ruta de la carpeta de fuente (congig-jar \ config \ activos \ fonts), en lugar de recorrer a través de todos los contenidos en el frasco . Sé que la ruta de la carpeta de fuente es fija, por lo que no quiero la sobrecarga de navegar a través de todas las carpetas en el contenedor.

+0

¿Quizás este pedazo de código funcione? 'JarEntry entry = getJarEntry (" congig-jar \ config \ assets \ fonts ");' 'InputStream input = jarFile.getInputStream (entrada);' –

+1

¿Quién hizo (hace) el Jar? Si es usted, tendría sentido poner una lista de los archivos incluidos en una ubicación conocida en el Jar. P.EJ. 'fonts/all.list'. Obtenga ese único recurso, léalo y tendrá la lista de nombres de entradas de fuentes. –

+0

Andrew- El archivo jar no está hecho por mí. Se atiende y se envía, y tengo que leer los archivos de fuentes dentro de mi carpeta de fuentes en el jar – nishMaria

Respuesta

1

puede utilizar

Class.getResourceAsStream ("/ PKG/resource_name");

este código comenzará a buscar recursos desde la ruta de clase.

http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html

+0

Si tengo que usar Class.getResourceAsStream ("/ pkg/resource_name"), entonces necesito dar el nombre exacto del archivo de fuente. Mi problema es que tengo varios archivos de fuentes dentro de mi carpeta de fuentes. Así que necesito una forma de dar primero la ruta de la carpeta dentro del archivo jar y luego iterar dinámicamente a través de todos los archivos dentro de la carpeta de fuente y luego registrarlos. – nishMaria

+0

Encontré esta publicación [http://stackoverflow.com/questions/1429172/how-do-i-list-the-files-inside-a-jar-file](http://stackoverflow.com/questions/1429172/how-do-i-list-the-files-inside-a-jar-file). – ejrav

+0

Mi requerimiento es básicamente bot para iterar a través de todos los archivos/carpetas en el jar, pero solo para iterar a través de la carpeta de fuentes ya que conozco el pacth donde residen los archivos de fuentes. Entonces, ¿hay alguna manera de que, le dé la ruta directa de la carpeta de fuentes en el contenedor y luego recorrer la carpeta de fuentes y leer los archivos de fuentes uno por uno? – nishMaria

3

Puede utilizar un cargador de clases para poner el frasco en que ruta de clase. y luego todos los archivos dentro del contenedor son recursos cargables.

//ref to some jar 
File f = new File("/tmp/foo.jar"); 

//create a new classloader for this jar 
URLClassLoader loader = URLClassLoader.newInstance(new URL[]{f.toURI().toURL()}); 

//load resource with classloader 
InputStream inputStream = loader.getResourceAsStream("foo/bar/test.txt"); 

//...do stuff with inputStream 
+1

Tengo varios archivos dentro de mi carpeta de fuentes. Así que necesito una forma tal que 1) dé la ruta directa de la carpeta dentro de mi archivo jar (de esta manera no tendré que iniciar primero el contenedor y luego leer los contenidos uno por uno y ver si la extensión es. ttd) 2) Iterar dinámicamente la carpeta uno a uno y registrarlos en el entorno de gráficos – nishMaria

+0

Me temo que no hay forma de que esto se pueda hacer con un ClassLoader. Un buen consejo es lo que sugiere Andrew Thompson en su comentario a su pregunta: almacene un archivo dentro del contenedor que enumere todos los pathes de la fuente; luego lea el archivo e itere sobre los pathes almacenados. – rompetroll

Cuestiones relacionadas