項目在 Windows Server 2003/7 正常生成驗證碼圖片,部署到 Windows Server 2008 後拋出 IIOException: Can't create output stream!,底層原因是 IOException: 系統找不到指定的路徑。
javax.imageio.IIOException: Can't create output stream!
at javax.imageio.ImageIO.write(...)
Caused by: javax.imageio.IIOException: Can't create cache file!
at javax.imageio.ImageIO.createImageOutputStream(...)
Caused by: java.io.IOException: 系統找不到指定的路徑。
at java.io.WinNTFileSystem.createFileExclusively(Native Method)
at java.io.File.createTempFile(...)
at javax.imageio.stream.FileCacheImageOutputStream.<init>(...)
ImageIO.write 內部調用 File.createTempFile 創建緩存文件。默認臨時目錄由系統屬性 java.io.tmpdir 指定。Windows Server 2008 上該目錄(如 C:\Users\ADMINI~1\AppData\Local\Temp\2)不存在或無權限,導致創建失敗。
2 子目錄)。-Djava.io.tmpdir=存在的目錄路徑。System.setProperty("java.io.tmpdir", "新路徑")(需在 ImageIO 初始化前)。public class TestTmpDir {
public static void main(String[] args) {
System.out.println("tmpdir = " + System.getProperty("java.io.tmpdir"));
}
}
跨系統部署時,注意 JVM 臨時目錄依賴。異常堆疊深入源碼可快速定位到 File.createTempFile,再結合系統屬性排查。