导出到 .jar 时从源文件夹加载多个图像
Loading multiple images from source folder when exporting to .jar
我有一个包含 3 种方法的程序,用于从特定来源的文件夹加载图像。第一个加载给定直接路径的单个图像。第二个加载文件夹中的所有图像并将它们存储在 ArrayList 中。第三个加载文件夹中所有文件夹中的所有图像。 (见下面的代码)
当我导出到 .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;
}
}
好吧,首先,您需要将目录更改为只说文件名,然后,最好的方法是将创建的 .jar 压缩为 .zip,解压缩,添加图像文件到解压缩的文件夹(或直接到 zip),然后再次重命名回 .jar。
您的方法不起作用,因为您的 jar 文件中没有任何目录,而不是因为您的 jar 中没有文件。
所以在 jar 文件中,所有文件都只有一层。文件名是路径+你的原始文件名。
这就是 img = ImageIO.read(LoadImages.class.getResource("/" + imageFile));
有效的原因。
File dir = new File(LoadImages.class.getResource("/" + directory).getFile());
无效,因为该目录不再存在。
我有一个包含 3 种方法的程序,用于从特定来源的文件夹加载图像。第一个加载给定直接路径的单个图像。第二个加载文件夹中的所有图像并将它们存储在 ArrayList 中。第三个加载文件夹中所有文件夹中的所有图像。 (见下面的代码)
当我导出到 .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;
}
}
好吧,首先,您需要将目录更改为只说文件名,然后,最好的方法是将创建的 .jar 压缩为 .zip,解压缩,添加图像文件到解压缩的文件夹(或直接到 zip),然后再次重命名回 .jar。
您的方法不起作用,因为您的 jar 文件中没有任何目录,而不是因为您的 jar 中没有文件。
所以在 jar 文件中,所有文件都只有一层。文件名是路径+你的原始文件名。
这就是 img = ImageIO.read(LoadImages.class.getResource("/" + imageFile));
有效的原因。
File dir = new File(LoadImages.class.getResource("/" + directory).getFile());
无效,因为该目录不再存在。