2012-03-02 41 views
5

Tôi có tệp jar, chứa nhiều thư mục khác nhau như hình ảnh, phông chữ, thư, v.v ... Tôi phải đọc tất cả các tệp trong thư mục phông chữ.Đọc tệp từ thư mục bên trong tệp jar

Hiện tại mã java của tôi đang lặp qua tất cả các nội dung trong tệp jar. Mã của tôi là như sau:

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

Có một cách mà tôi có thể cung cấp cho các đường dẫn của thư mục phông chữ (congig-jar \ config \ tài sản \ fonts), chứ không phải đi qua qua tất cả các nội dung trong jar . Tôi biết đường dẫn của thư mục phông chữ là cố định, vì vậy tôi không muốn các chi phí của travesring thông qua tất cả các thư mục trong jar.

+0

Có thể đoạn mã này hoạt động? 'JarEntry entry = getJarEntry (" congig-jar \ config \ assets \ fonts ");' 'InputStream input = jarFile.getInputStream (mục nhập);' –

+1

Ai tạo ra (làm) Jar? Nếu đó là bạn, nó sẽ có ý nghĩa để đưa một danh sách các tập tin bao gồm trong một vị trí được biết đến trong Jar. VÍ DỤ. 'fonts/all.list'. Lấy tài nguyên đó, đọc nó, và bạn có danh sách các tên mục nhập phông chữ. –

+0

Andrew- Tập tin jar không được tạo bởi tôi. Nó được assmebled và gửi, và tôi phải đọc các tập tin font bên trong thư mục font của tôi trong jar – nishMaria

Trả lời

1

bạn có thể sử dụng

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

mã này sẽ bắt đầu tìm kiếm tài nguyên từ đường dẫn lớp.

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

+0

Nếu tôi phải sử dụng Class.getResourceAsStream ("/ pkg/resource_name"), thì tôi cần phải cung cấp tên chính xác của tệp phông chữ. Vấn đề của tôi là, tôi có nhiều tệp phông chữ bên trong thư mục phông chữ của mình. Vì vậy, tôi cần một cách đầu tiên cung cấp cho đường dẫn của thư mục bên trong tệp jar và sau đó tự động lặp qua tất cả các tệp bên trong thư mục phông chữ và sau đó đăng ký chúng. – nishMaria

+0

Tôi tìm thấy bài đăng này [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-bên trong-a-jar-file). – ejrav

+0

Yêu cầu của tôi về cơ bản là bot lặp lại thông qua tất cả các tệp/thư mục trong jar, nhưng chỉ để lặp qua thư mục phông chữ vì tôi biết pacth nơi các tệp phông chữ cư trú. Vì vậy, có một cách như vậy mà, tôi cung cấp cho các đường dẫn trực tiếp của thư mục phông chữ trong lọ và sau đó lặp qua thư mục phông chữ và đọc các tập tin phông chữ từng người một? – nishMaria

3

Bạn có thể sử dụng một Classloader để đưa jar vào bạn classpath. và sau đó tất cả các tập tin bên trong bình chứa là các tài nguyên có thể nạp được.

//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

Tôi có một số tệp trong thư mục phông chữ của mình. Vì vậy, tôi cần một cách như vậy mà 1) Tôi cung cấp cho các đường dẫn trực tiếp của thư mục bên trong tập tin jar của tôi (Bằng cách này tôi sẽ không phải đầu tiên init jar và sau đó đọc nội dung bên trong từng cái một và xem nếu phần mở rộng tập tin được. ttd) 2) Lặp lại từng thư mục một cách linh hoạt và đăng ký chúng trong môi trường đồ họa – nishMaria

+0

Tôi e rằng không có cách nào để thực hiện điều này bằng cách sử dụng Trình nạp lớp. Một lời khuyên tốt là những gì Andrew Thompson gợi ý trong bình luận của mình cho câu hỏi của bạn: lưu trữ một tập tin bên trong lọ liệt kê tất cả các đường dẫn phông chữ; sau đó đọc tệp và lặp lại các đường dẫn được lưu trữ. – rompetroll

Các vấn đề liên quan