Как получить доступ ко многим изображениям ресурсов в папке в банке в Java? - PullRequest
0 голосов
/ 08 июля 2020

У меня есть этот класс для загрузки синих изображений, который отлично работает в Eclipse, но не в экспортированной банке. Как я могу получить доступ ко всем синим изображениям в папке (каталоге) с названием "blue", не зная имен изображений?

public class Blue
{
   public static void read() throws Exception
   {
      File directoryBlueImages = new File(
            Blue.class.getResource("blue").getFile());
      String[] blueImages = directoryBlueImages.list();
      List<BufferedImage> blueImagesList = new ArrayList<>();
      for (String blueImage : java.util.Objects.requireNonNull(blueImages))
      {
         blueImagesList.add(ImageIO
               .read(Blue.class.getResourceAsStream("blue/" + blueImage)));
      }
      ApplicationImages.setBlueImages(blueImagesList);
   }
}

UPDATE

Я пробовал это, но это работает тоже не работает. Я получаю исключение NullPointer. Я пробовал "/ синий" и "синий" и даже ". Синий".

import java.awt.image.BufferedImage;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

import javax.imageio.ImageIO;

import vokabeltrainer.ApplicationImages;

public class Blue
{
   public static void read() throws Exception
   {
      List<BufferedImage> blueImagesList = new ArrayList<>();

      try (Stream<Path> pathStream = Files.walk(Paths.get(Blue.class
            .getClassLoader().getResource("blue").toURI().toURL().getPath()))
            .filter(Files::isRegularFile))
      {
         for (Path file : (Iterable<Path>) pathStream::iterator)
         {
            blueImagesList.add(ImageIO
                  .read(Blue.class.getResourceAsStream(file.toString())));
            ;
         }
      }

      ApplicationImages.setBlueImages(blueImagesList);
   }
}

1 Ответ

0 голосов
/ 09 июля 2020

Я адаптировал ответ от Как вывести список файлов внутри JAR-файла?

Сначала я различаю guish при запуске из jar или Eclipse:

  try
  {
     Blue.readZip(); // when inside jar
  }
  catch (Exception e)
  {
     try
     {
        Blue.read(); // during development
     }
     catch (Exception e1)
     {
        System.out.println("Could not read blue.");
        e1.printStackTrace();
     }
  }

Тогда класс Blue выглядит так:

public class Blue
{
   private static List<BufferedImage> blueImagesList = new ArrayList<>();

   public static void read() throws Exception
   {
      File directoryBlueImages = new File(
            Blue.class.getResource("blue").getFile());
      String[] blueImages = directoryBlueImages.list();

      for (String blueImage : java.util.Objects.requireNonNull(blueImages))
      {

         blueImagesList.add(ImageIO
               .read(Blue.class.getResourceAsStream("blue/" + blueImage)));

      }
      ApplicationImages.setBlueImages(blueImagesList);
   }

   public static void readZip() throws Exception
   {
      CodeSource src = Blue.class.getProtectionDomain().getCodeSource();
      if (src != null)
      {
         URL jar = src.getLocation();
         ZipFile zipFile = new ZipFile(jar.getFile());
         ZipInputStream zip = new ZipInputStream(jar.openStream());
         while (true)
         {
            ZipEntry ze = zip.getNextEntry();
            if (ze == null)
               break;
            String name = ze.getName();
            if (name.startsWith("vokabeltrainer/resources/blue/"))
            {
               blueImagesList.add(ImageIO.read(zipFile.getInputStream(ze)));
            }
         }
      }
      else
      {
         throw new IOException("can not find code source for blue images");
      }
      ApplicationImages.setBlueImages(blueImagesList);
   }
}
...