我已经阅读了很多关于这个问题的其他问题和资源,但我仍然无处可去。前几天我问了一个关于这个的问题,并再次提到了其他问题。也许我只是没有得到它,但我一直在尝试为我的java项目getResourceAsStream 2天,所以我可以让jar工作无济于事。
我的项目中有两个地方会导致问题。我的缓冲图像类:
public static BufferedImage loadImage(String fileName) {
try {
File file = new File(fileName);
//System.out.println("Is the file there for " + fileName + " : " + file.exists());
BufferedImage sub = ImageIO.read(file);
return toCompatibleImage(sub);
}
catch (IOException e) {
System.out.println("Image load failed: " +fileName);
// e.printStackTrace();
return null;
}
}
我的GifHandler课程:
public enum GifHandler {
Mouse("Resources/Images/cursor/", ".gif", 45, 45),
Coaster("Resources/Images/animatedCoaster/", ".gif", Carnies.PWIDTH, Carnies.PHEIGHT/2),
Fire("Resources/Images/fire/", ".gif", 100, 100);
public BufferedImage[] sequence;
int playing = 0;
GifHandler(String dir_name, String type, int width, int height) {
int numImgs = new File(dir_name).list().length;
if (sequence == null) {
sequence = new BufferedImage[numImgs];
for (int i = 0; i < numImgs; i++) {
sequence[i] = ImageLoader.loadScaledImage(dir_name + i + type, width, height, false);
}
}
}
}
我已将resources文件夹添加到构建路径库中。我的项目文件结构如下: &#34;项目/ SRC / defaultpackage /类文件&#34; &#34;项目/资源/图片/图像文件中&#34; 我想明确地从类文件中引用图像文件。 我尝试过更改为getResourceAsStream,但始终在路径上获取null。
例如,如图所示更改imageLoader类,返回null:
String path = ImageLoader.class.getResourceAsStream(fileName).toString(); 其中fileName作为&#34; resource / Images / alphabet.png&#34;传入例如。 我已经尝试了添加和删除/的每个组合,只引用/alphabet.png而没有引导文件夹等。我在我的绳子的最后。请帮忙。如果我没有链接足够的代码来理解它,那么它的回购是在github.com/madamsmall/carnies
答案 0 :(得分:3)
我的项目文件结构如下:“Project / src / defaultpackage / classfiles”“Project / resources / Images / imagefiles”
当您使用getClass().getResourceAsStream()
时,程序将从调用类的位置开始搜索。因此,通过传递"resource/Images/alphabet.png"
,您说resources
位于classfiles
,而不是/
。要修复它,您需要允许遍历搜索。您可以通过在路径中添加getClass().getResourceAsStream("/resource/Images/alphabet.png")
来实现。所以/
另一种选择是使用类加载器,它将从根搜索。在这种情况下,您不需要额外的getClass().getClassLoader().getResourceAsStream("resource/Images/alphabet.png");
,并且您当前的路径是正确的。 getClass()
注意: ImageLoader.class
和getClass()
在大多数情况下都是可以互换的,如果您想知道我使用import java.awt.Image;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
public class ImageLoader {
public static void main(String[] args) throws IOException {
InputStream is = ImageLoader.class.getResourceAsStream("/resource/images/alphabet.png");
Image image = ImageIO.read(is);
JLabel label = new JLabel(new ImageIcon(image));
JOptionPane.showMessageDialog(null, label);
}
}
的原因
<强>更新强>
将此示例用作测试
resource
更新2
我刚注意到src
不在private String[] getFileNames() throws URISyntaxException {
URL url = getClass().getResource("/resources/images/");
File file = new File(url.toURI());
String[] fileNames = file.list();
for (String s : fileNames) {
System.out.println(s);
}
return fileNames;
}
中,因此当它构建时,它会内置到类路径中。
更新3
如果要获取所有文件名的列表,可以使用此方法。然后,您可以使用这些文件名执行任何操作。
{{1}}