2012-03-09 14 views
0

「クラス」、「リソース」などのさまざまなフォルダに「san.jar」というjarファイルがあります。 「resources/jarファイルとしてのフォルダの下の画像や画像の数などの情報がないさまざまな画像があり、私はそのジャーを解凍することができません。特定のパスを指定してjarファイルの内容を読み取る

目的:jarファイル全体を反復せずに、指定されたパスの下にあるすべてのファイルを取得する必要があります。

今、私がやっているのは、すべてのエントリを繰り返して、いつでも.jpgファイルに出会って、何らかの操作を実行します。 "resources/assets/images"だけを読むために、私はjarfile全体を繰り返しています。

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"だけを読むために、私はjarfile全体を繰り返しています。

+1

は 'em.nextElement()'または 'em1.nextElement()'ですか? – Rakesh

+0

*「今、私がやっているのは、各エントリごとに繰り返され、いつでも.jpgファイルに出くわして、何らかの操作を実行する」です。*一度読んで情報をキャッシュしてみてはいかがですか? –

+0

申し訳ありません、そのem、em1ではありません。 –

答えて

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ファイル全体を反復処理します。 –

+0

JARファイル全体を反復せずに、あなたがしていることはできないと思います。 – Adam

+0

@SanthoshRaj、はい、すべてのディレクトリのすべてのファイルを繰り返して、ファイル名が終了するかどうか確認しています.jpgで。私のコードでは、必要なディレクトリにのみファイルを繰り返しています。これにより、反復回数が減ります。 – Rakesh

0

あなたの目的に機能JPGファイルが大文字の拡張子JPGを持っている場合...それも動作します。 Javaの8とファイルシステムで

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

+0

はい、あなたのソリューションのように:) – Adam

0

はそれが

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だけで所望の深さを提供してパスを検索します、今非常に簡単です。

関連する問題