2016-04-09 83 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。