2016-04-09 81 views
0

我有一個程序,有3個用於從特定來源文件夾加載圖像的方法。第一個加載一個給定直接路徑的圖像。第二個加載文件夾中的所有圖像並將它們存儲在ArrayList中。第三個加載文件夾內所有文件夾的所有圖像。 (見下面的代碼)導出到.jar時從源文件夾加載多個圖像

當我導出到.jar時,第一種方法工作正常。其他兩種方法失敗。 據我瞭解,它不工作,因爲你不能在.jar文件。

因此,代碼在這裏第一次失敗:

File dir = new File(LoadImages.class.getResource("/" + directory).getFile()); 

我想過用的FileInputStream代替,但我想不出向流分成幾部分,這樣我可以分配圖像。

唯一的工作,我身邊能想到至今

public static ArrayList<BufferedImage> loadImageFolder(String directory) { 
    ArrayList<BufferedImage> images = new ArrayList<BufferedImage>(); 
    int i = 0; 
    while (true) { 
     try { 
      BufferedImage img = ImageIO.read(LoadImages.class.getResource("/" + directory + "[" + i + "].png")); 
      images.add(img); 
      i++; 
     } catch (Exception e) { 
      break; 
     } 
    } 
    return images; 
} 

但迫使你以某種模式命名您的文件。這是可能的,因爲您可以在導出之前更改文件名稱,但我想知道是否有沒有這樣的方法。

在此先感謝。

下面的工作方法導出前

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.FilenameFilter; 
import java.io.FileFilter; 
import java.io.IOException; 
import java.util.ArrayList; 

import javax.imageio.ImageIO; 

public class LoadImages { 

    static String extensions = "png"; 

    static FilenameFilter imageFilter = new FilenameFilter() { 

     @Override 
     public boolean accept(File dir, String name) { 
      if (name.endsWith("." + extensions)) { 
       return true; 
      } 
      return false; 
     } 
    }; 

    static FileFilter folderFilter = new FileFilter() { 

     @Override 
     public boolean accept(File f) { 
      if (f.isDirectory()) { 
       return true; 
      } 
      return false; 
     } 
    }; 

    public static BufferedImage loadImage(String imageFile) { 
     BufferedImage img = null; 
     try { 
      img = ImageIO.read(LoadImages.class.getResource("/" + imageFile)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return img; 
    } 

    public static ArrayList<BufferedImage> loadImageFolder(String directory) throws IOException { 
     File dir = new File(LoadImages.class.getResource("/" + directory).getFile()); 
     ArrayList<BufferedImage> images = new ArrayList<BufferedImage>(); 
     if (dir.isDirectory()) { 
      for (File f : dir.listFiles(imageFilter)) { 
       BufferedImage img = null; 

       try { 
        img = ImageIO.read(f); 
        images.add(img); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    public static ArrayList<ArrayList<BufferedImage>> loadImageFoldersInFolder(String directory) { 

     File dir = new File(LoadImages.class.getResource("/" + directory).getFile()); 
     ArrayList<ArrayList<BufferedImage>> folders = new ArrayList<ArrayList<BufferedImage>>(); 
     if (dir.isDirectory()) { 
      ArrayList<BufferedImage> imagesHere = new ArrayList<BufferedImage>(); 
      for (File f : dir.listFiles(imageFilter)) { 
       BufferedImage img = null; 

       try { 
        img = ImageIO.read(f); 
        imagesHere.add(img); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      folders.add(imagesHere); 
      for (File f : dir.listFiles(folderFilter)) { 
       ArrayList<BufferedImage> folder = new ArrayList<BufferedImage>(); 
       for (File x : f.listFiles(imageFilter)) { 
        BufferedImage img = null; 

        try { 
         img = ImageIO.read(x); 
         folder.add(img); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       folders.add(folder); 
      } 
     } 
     return folders; 
    } 

} 
+0

請參閱:http://stackoverflow.com/questions/11012819/how-can-i-get-a-resource-folder-from-inside-my-jar-file – Zire

回答

0

您的方法不起作用,因爲您沒有jar文件中的任何可用庫,也不是因爲您的jar中沒有文件。

因此,在一個jar文件中,您只有一個級別,其中包含所有文件。文件名是路徑+你是原始文件名。

這就是爲什麼img = ImageIO.read(LoadImages.class.getResource("/" + imageFile));有效。

File dir = new File(LoadImages.class.getResource("/" + directory).getFile()); 

不起作用,因爲該目錄不再存在。

+0

啊,它解釋了它是如何工作的。謝謝。因此,沒有辦法讓程序找出名稱/文件夾/ ...下有多少個文件? – Zire

+0

我認爲唯一的選擇是手動檢查jar的所有文件,並檢查文件名是否以'.../yourfolder'開頭 – Dimi

0

嗯,首先,你要更改目錄,只是說文件名,然後,去它的最好辦法是使創建將.jip壓縮成.zip文件,將其解壓縮,將圖像文件添加到解壓縮的文件夾(或者直接壓縮到zip),然後重新命名爲.jar。