如何在外部文本文件中定义文件名时加载文件?

时间:2013-11-26 20:58:36

标签: java

鉴于我使用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()));其中inScanner的实例。

我也尝试在文本文件中使用./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)

3 个答案:

答案 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.");
}