Exception in thread "main" javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1301)
at swing.Demo1.main(Demo1.java:22)
`ImageIO.read(File)` 或 `read(InputStream)` **找不到文件或流為空**。常見誤區:
File imgFile = new File("D:/projects/MyProject/images/bg.png"); // 絕對路徑
BufferedImage img = ImageIO.read(imgFile);
File imgFile = new File("images/bg.png"); // 相對 build/classes/// 圖片放在 src/resources/images/bg.png (Maven) 或 src/images/bg.png (普通項目)
// 編譯後自動進入 build/classes/images/bg.png 或 JAR 根目錄/images/bg.png
InputStream is = getClass().getResourceAsStream("/images/bg.png"); // 斜槓開頭 = 類路徑根
if (is == null) {
throw new IllegalStateException("資源未找到: /images/bg.png");
}
BufferedImage img = ImageIO.read(is);
// 打印類路徑資源真實 URL 確認路徑
URL url = getClass().getResource("/images/bg.png");
System.out.println("資源 URL: " + url);
// null 表示未找到;file:/... 或 jar:file:/...!/... 表示找到
// 列出 JAR 內所有資源驗證打包
try (JarFile jar = new JarFile("dist/MyApp.jar")) {
jar.stream().filter(e -> e.getName().endsWith(".png"))
.forEach(e -> System.out.println(e.getName()));
}
| 現象 | 原因 | 修正 |
|---|---|---|
| IDE 運行正常,JAR 雙擊報錯 | 用 `new File("相對路徑")` 讀取,JAR 內無文件系統路徑 | 改用 `getResourceAsStream()` |
| 大小寫不匹配 | Windows 不區分大小寫,Linux/JAR 區分 | 路徑大小寫與文件名完全一致 |
| 資源文件未打包 | 未配置複製資源,或放在 `src/` 非資源目錄 | Maven 放 `src/main/resources`,Ant 配置 `copy` 任務 |
| 輸入流已關閉/位置錯誤 | 同一流被多次讀取,或 `mark/reset` 不支持 | 每次讀取重新 `getResourceAsStream()` |