鉴于我使用Scanner
读取的标准文本文件,其中第一行包含要读取的图像的名称(与文本文件位于同一文件夹中),我该如何使用文件名加载图像显示在屏幕上?就目前而言,我得到一个javax.imageio.IIOException
说“无法读取输入文件!”我无法弄清楚为什么不。
这是文本文件:
MapBig.jpg
2
5
439 203 405 253 431 280 499 257 495 217
5
57 147 164 72 190 127 105 300 70 260
以下是我的阅读代码:image = ImageIO.read(new File(in.nextLine()));
其中in
是Scanner
的实例。
我也尝试在文本文件中使用./MapBig.jpg
,我也遇到了同样的问题。
我想还应该注意到我正在使用ClassLoader.getSystemResourceAsStream("map.data");
阅读文本文件,因为此文件位于我的项目的源文件夹中...与文件MapBig.jpg
相同的文件夹
出现错误时,这是一个堆栈跟踪:
javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(Unknown Source)
at graphics.MapPanelSettings.<init>(MapPanelSettings.java:32)
at graphics.GameFrame.initialize(GameFrame.java:71)
at graphics.GameFrame.<init>(GameFrame.java:49)
at game.GameLauncher.main(GameLauncher.java:9)
答案 0 :(得分:2)
问题确实在正确的位置
您可以通过获取要与ClassLoader一起使用的位置来构建正确的路径:
URL url = ClassLoader.getSystemResource("map.data");
String fileName = in.nextLine();
String dirPath = new File(url.getPath()).getParent();
File myImage = new File(dirPath, fileName);
这应该有效。抱歉原始示例不完整。
修改强> 好吧,您实际上不需要使用“map.data”位置来计算路径。你直接使用:
String fileName = in.nextLine();
URL imageUrl = ClassLoader.getSystemResource(fileName);
File myImage = new File(imageUrl.getPath());
希望有所帮助。
答案 1 :(得分:1)
您的图片必须从文件系统加载,而不是从.jar文件本身加载。如果您的映像位于系统的其他位置(除了.jar文件之外的其他目录),则应使用与MapBig.jpg
不同的文件名。您可以更改map.data
文件中的文件名,或者将默认目录作为前缀添加到map.data
文件中加载的文件名中。
每当您要加载的文件在Jar文件本身中被放置时,您需要将它们作为资源加载。检查以下示例:
URL imgUrl = getClass().getResource(in.nextLine());
ImageIcon imgIcon = new ImageIcon(imgUrl);
Image img = imgIcon.getImage();
如果您的图像位于子目录中,则需要在文件名前加上正确的目录路径,例如:
URL imgUrl = getClass().getResource("resources/" + in.nextLine());
ImageIcon imgIcon = new ImageIcon(imgUrl);
Image img = imgIcon.getImage();
您还应该调试需要加载的文件名是否正确。例如,暂时将image = ImageIO.read(new File(in.nextLine()));
行替换为System.out.println("File to load: " + in.nextLine().toString());
,并确保此名称正确无误。您可以轻松使用以下脚本自动检查文件(您是否正在尝试加载)是否存在,如果不是这样,则打印错误;
File f = new File(in.nextLine());
if(f.exists() && f.isFile())
image = ImageIO.read(f);
else
System.out.println("Unable to load image, file doesn't exist: " + f.getName());
答案 2 :(得分:1)
试试这个..
File file = new File(in.nextLine());
if(file.exists()){
image = ImageIO.read(file);
} else {
System.out.println("given file " + file.getName() + " not found.");
}