我很苦恼于这个问题,因此我正在寻求帮助。
我有一段代码循环执行以下操作:
//imports ommitted
public void afterPropertiesSet() throws Exception{
//building of URL list ommitted
// urlMap is a HashMap <String,String> created and populated just prior
for ( Object urlVar : urlMap.keySet() ){
String myURLvar = urlMap.get(urlVar.toString);
System.out.println ("URL is "+myURLvar );
BufferedImage imageVar = ImageIO.read(myURLvar);//URL confirmed to be valid even for executions that fail
String fileName2Save = "filepath"// a valid file path
System.out.println ("Target path is "+fileName2Save );
File file2Save = new File (fileName2Save);
fileName2Save.SetWriteable(true);//set these just to be sure
fileName2Save.SetReadable(true);
try{
ImageIO.write (imageVar,"png",file2save)//error thrown here
}catch (Exception e){
System.out.println("R: "+file2Save.canRead()+" W: "+file2Save.canWrite()+" E:"+file2Save.canExecute()+" Exists: "+file2Save.exists+" is a file"+file2Save.isFile() );
System.out.println("parent Directory perms");// same as above except on parent directory of destination
}//end try
}//end for
}
这一切都在Windows 7和JDK 1.6.26以及Netbeans、Tomcat 7.0.14上运行。目标目录实际上位于我的netbeans项目目录中,位于普通Web应用程序的文件夹中(WEB-INF之外),我通常会期望在那里有写入文件的权限。
当出现错误时,对于文件的两个结果分别是a.)全为假 b.)全为真。父目录权限永远不会更改,除了isFile之外永远为真。
抛出的错误(java.IO.error,并带有“access denied”)并非每次都发生...事实上,循环运行60%的时间它不会抛出任何错误。剩余40%的时间,我在它写入的60多个文件中的一个上收到错误。偶尔是同一个。它开始的URL的顺序每次都会改变,因此编写文件的顺序是可变的。文件名具有简短而简洁的名称,例如“1.png”。图像很小...小于8k。
为确保权限正确,我已经:
- 给予每个人从net beans项目目录向下的“完全控制” - 以管理员身份运行JDK、JRE和Netbeans - 禁用UAC
然而错误仍然存在。对此的谷歌搜索似乎五花八门,而且通常读起来像巫术。显然,我(以及Java和Netbeans等)应该有权限将文件写入目录。
任何人有任何见解吗?这是所有内容(代码和托管URL的Web服务器)都在封闭系统上,因此我无法剪切和粘贴代码或堆栈跟踪。
更新:我通过在每次读取之前进行println和toString来确认imageURL有效。然后,我确认a.)托管目标URL的Web服务器返回了带有http 200代码的图像b.)在Web浏览器中测试时,该URL返回了图像。在测试中,我还在读取后添加了if()来确认值不为空或空。我还对所有其他值进行了Null的测试。它们总是按预期工作,即使失败也是如此。错误始终在try块内发生。目标目录在每次执行之前都是相同的。在每次执行之前,目录都是空的。
更新2:这里是其中一个堆栈跟踪(在这种情况下,file2Save的权限为R:True W:True E:True isFile:True exists:True)
java.io.FileNotFoundException <fullFilepathhere> (Access is denied)
at java.io.RandomAccessFile.open(Native Method)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212)
at javax.imageio.stream.FileImageOutputStream.<init>(FileImageOutputStream.java:53)
at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.java:37)
at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:393)
at javax.imageio.ImageIO.write(ImageIO.java:1514)
at myPackage.myClass.afterPropertiesSet(thisClassexample.java:204)// 204 is the line number of the ImageIO write