2013-11-26 132 views
1

鉴于我与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) 
+0

我试着给你的问题给出正确的答案,但是你可以发布你正在收到的堆栈跟踪错误,所以我们可以很容易地看到发生了什么问题?提前致谢。 –

+0

基于堆栈跟踪:确实是错误的输入文件。您可能错误地加载了文件,因为输入文件无法读取。你也应该确保你的'resources'目录放置正确。这个目录应该在**你的'src'目录里。我在我的回答中更清楚地解释了这一点。 –

回答

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

你的形象已经被从文件系统加载,而不是从.jar文件本身。如果您的映像位于系统中的其他目录(不是您的.jar文件所在的目录),则应使用与MapBig.jpg不同的文件名。您可以在map.data文件更改文件名,或者你作为前缀从map.data文件中添加默认目录加载的文件名。 无论何时您要加载的文件都在Jar文件本身中进行loacated,您需要将它们加载为资源。检查例如波纹管:

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()); 
+0

它正在读取正确的文件名,但它没有找到该文件,因为它似乎没有在正确的文件夹中查找。 – agent154

+0

你说你的文件位于'resources'。你确定你正在从这个目录加载文件吗?除此之外,你确定你的资源目录位于'src'目录内,而不是在这个目录之外? (如果没有,只需将你的资源文件夹移动到你的'src'目录中即可。 你的目录应该像这样放置:http://d.pr/i/as7K –

1

尝试用这个..

File file = new File(in.nextLine()); 
if(file.exists()){ 
    image = ImageIO.read(file); 
} else { 
    System.out.println("given file " + file.getName() + " not found."); 
} 
+0

我的确将消息打印出来给控制台“给定文件MapBig.jpg没有找到。“ – agent154

+0

你确定你的课程也在同一个文件夹吗? – subash

+0

我使用Eclipse,这是一个相当大的项目,包含各种软件包和文件夹,我有一个名为”resources“的文件夹,图像和数据文件,其余的文件在子文件夹'/ src'中,类文件不在同一个文件夹中 – agent154