2012-03-09 58 views
0

我有一個名爲「san.jar」與各種文件夾,如「類」,「資源」等的jar文件, 說例如我有一個像「資源/資產/圖像「,其中有各種圖像,我沒有任何關於他們的信息,如圖像的名稱或文件夾下的圖像數量,因爲jar文件是私人的,我不允許解壓縮jar。閱讀給定具體路徑的jar文件的內容

OBJECTIVE:我需要獲取給定路徑下的所有文件,而不必遍歷整個jar文件。

現在我正在做的是遍歷每一個條目,每當我遇到.jpg文件,我執行一些操作。 這裏只是讀取「resources/assets/images」,我遍歷整個jar文件。

JarFile jarFile = new JarFile("san.jar"); 
for(Enumeration em = jarFile.entries(); em.hasMoreElements();) { 
       String s= em.nextElement().toString(); 
       if(s.contains("jpg")){ 
        //do something 
       } 
} 

現在我正在做的是遍歷每一個條目,每當我遇到.jpg文件,我執行一些操作。 這裏只是讀取「resources/assets/images」,我遍歷整個jar文件。

+1

它是'em.nextElement()'或'em1.nextElement()'? – Rakesh 2012-03-09 07:23:46

+0

*「現在我所做的是遍歷每一個條目,並且每當我遇到.jpg文件時,我都會執行一些操作。」*爲什麼不讀取它們並緩存信息? – 2012-03-09 07:44:27

+0

對不起,它的時間,而不是em1。 – 2012-03-09 08:00:37

回答

0

此代碼的工作你的目的

JarFile jarFile = new JarFile("my.jar"); 

    for(Enumeration<JarEntry> em = jarFile.entries(); em.hasMoreElements();) { 
     String s= em.nextElement().toString(); 

     if(s.startsWith(("path/to/images/directory/"))){ 
      ZipEntry entry = jarFile.getEntry(s); 

      String fileName = s.substring(s.lastIndexOf("/")+1, s.length()); 
      if(fileName.endsWith(".jpg")){ 
       InputStream inStream= jarFile.getInputStream(entry); 
       OutputStream out = new FileOutputStream(fileName); 
       int c; 
       while ((c = inStream.read()) != -1){ 
        out.write(c); 
       } 
       inStream.close(); 
       out.close(); 
       System.out.println(2); 
      } 
     } 
    } 
    jarFile.close(); 
+0

嗨Rakesh, 感謝您的回覆。但是你不覺得,你正在使用和我一樣的邏輯嗎?你將它與「startsWith()」進行比較,而我將它與做相同操作的「conatins()」進行比較。但是,在這兩種情況下,它都遍歷整個jar文件。 – 2012-03-09 09:49:00

+0

我不認爲你可能沒有迭代通過整個JAR文件.... – Adam 2012-03-09 10:06:47

+0

@SanthoshRaj,是的我同意,好吧,你遍歷每個目錄中的每個文件,並檢查文件名是否結束與.jpg。在我的代碼中,我只在需要的目錄中迭代文件。所以這減少了迭代次數。 – Rakesh 2012-03-09 10:16:21

0

這可以用一個正則表達式簡明得多做......它也將在JPG文件有大寫擴展JPG工作。

JarFile jarFile = new JarFile("my.jar"); 

Pattern pattern = Pattern.compile("resources/assets/images/([^/]+)\\.jpg", 
     Pattern.CASE_INSENSITIVE); 

for (Enumeration<JarEntry> em = jarFile.entries(); em 
     .hasMoreElements();) { 
    JarEntry entry = em.nextElement(); 

    if (pattern.matcher(entry.getName()).find()) { 
     BufferedImage image = ImageIO.read(jarFile 
       .getInputStream(entry)); 
     System.out.println(image.getWidth() + " " 
       + image.getHeight()); 

    } 
} 
jarFile.close(); 
+0

迭代整個罐子?這可以在沒有迭代整個罐子的情況下完成嗎? – Rakesh 2012-03-09 10:54:38

+0

是的,就像你的解決方案:) – Adam 2012-03-09 11:01:53

0

利用Java 8和文件系統現在是很容易的,

Path myjar; 
try (FileSystem jarfs = FileSystems.newFileSystem(myjar, null)) { 
    Files.find(jarfs.getPath("resources", "assets", "images"), 
       1, 
       (path, attr) -> path.endsWith(".jpg"), 
       FileVisitOption.FOLLOW_LINKS).forEach(path -> { 
      //do something with the image. 
    }); 
} 

Files.find將只搜索提供的路徑了所需的深度。