2016-04-09 7 views
0

У меня есть программа с тремя методами, которые используются для загрузки изображений из определенных источников. Первый загружает одно изображение, заданное прямым путем. Второй загружает все изображения из папки и сохраняет их в ArrayList. И третий загружает все изображения из всех папок в папке. (см. код ниже)Загрузка нескольких изображений из исходной папки при экспорте в .jar

Когда я экспортирую в .jar, первые методы работают нормально. Другие 2 метода не работают. Насколько я понимаю, это не работает, потому что у вас не может быть файлов в .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

Ваш метод не работает, потому что у вас нет dircetories в файле jar, а не потому, что вы не можете иметь файлы в своей банке.

поэтому в файле jar у вас есть только один уровень, где находятся все ваши файлы. Имена файлов - это путь + исходное имя файла.

Именно поэтому img = ImageIO.read(LoadImages.class.getResource("/" + imageFile)); работ.

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

не работает, потому что каталог больше не существует.

+0

ах, который объясняет, как это работает. Благодарю. Таким образом, нет способа определить, сколько программ существует под именем/папкой/...? – Zire

+0

Я думаю, что единственный вариант - вручную просмотреть все файлы в банке и проверить, начинается ли имя файла с '.../yourfolder' – Dimi

0

Ну, во-первых, вы хотите изменить каталог, чтобы просто сказать имя файла, то лучший способ это сделать, чтобы сделать созданный .jar в .zip, разархивируйте его, добавьте файлы изображений в распакованную папку (или просто прямо к zip-файлу), а затем просто переименуйте снова обратно в .jar.

Смежные вопросы