Java文件IO和";“拒绝访问”;错误
我一直在为此烦恼,因此我正在寻求帮助 我有一个执行以下操作的代码循环Java文件IO和";“拒绝访问”;错误,java,windows-7,file-io,Java,Windows 7,File Io,我一直在为此烦恼,因此我正在寻求帮助 我有一个执行以下操作的代码循环 //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
//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
}
//导入ommitted
public void afterPropertieSet()引发异常{
//建立URL列表ommitted
//urlMap是一个HashMap,它是在之前创建和填充的
对于(对象urlVar:urlMap.keySet()){
字符串myURLvar=urlMap.get(urlVar.toString);
System.out.println(“URL为”+myURLvar);
BuffereImage imageVar=ImageIO.read(myURLvar);//即使执行失败,URL也被确认为有效
字符串fileName2Save=“filepath”//a有效的文件路径
System.out.println(“目标路径为”+fileName2Save);
File file2Save=新文件(fileName2Save);
fileName2Save.SetWriteable(true);//设置这些只是为了确保
fileName2Save.SetReadable(true);
试一试{
ImageIO.write(imageVar,“png”,file2save)//此处抛出错误
}捕获(例外e){
System.out.println(“R:+file2Save.canRead()+”W:+file2Save.canWrite()+”E:+file2Save.canExecute()+”存在:“+file2Save.Exists+”是一个文件“+file2Save.isFile()”);
System.out.println(“父目录perms”);//与上面相同,但在目标的父目录上除外
}//结束尝试
}//结束
}
这些都运行在Windows7和JDK1.6.26以及Netbeans、Tomcat7.0.14上。目标目录实际上位于我的netbeans项目目录中,在一个普通web应用程序(web-INF外部)的文件夹中,我通常希望在该文件夹中有写文件的权限
当错误发生时,我得到文件的两个结果之一a.)全部为假b.)全部为真。父目录权限永远不会更改除isFile之外的所有true
引发的错误(java.IO.error,带“拒绝访问”)不是每次都会发生…事实上,循环运行时有60%的时间不会抛出错误。其余40%的时间我在它写入的60多个文件中的一个上出现错误。不经常是同一个。它从URL开始的顺序每次都会更改,因此文件写入的顺序是可变的。文件名有短的缩写mes类似于“1.png”。图像很小,小于8k
为了确保权限正确,我有:
从netbeans项目目录下给每个人“完全控制权”
以管理员身份运行JDK、JRE和Netbeans
残疾UAC
但是错误依然存在。谷歌搜索这个文件的范围似乎很广,读起来像vodoo。显然,我(以及Java和Netbeans等)应该有权限将文件写入目录
有人有什么见解吗?这是一个封闭系统上的全部(代码和承载URL的web服务器),所以我不能剪切和粘贴代码或堆栈跟踪
更新:我通过在每次读取之前执行println&toString来确认imageURL是有效的。然后我确认a.)托管目标URL的web服务器返回了带有http 200代码的图像b.)URL在web浏览器中测试时返回了图像。在测试中,我还添加了if()在读取后输入,以确认值不是NULL或空。我还对所有其他值进行了NULL测试。即使出现故障,它们也始终如预期的那样。错误总是发生在try块内。每次执行时目标目录都相同。每次执行前,目录都为空
更新2:这里是一个堆栈跟踪(在本例中,file2Save的perm是R:True W:True E:True isFile:True exists:True)
java.io.FileNotFoundException(访问被拒绝)
位于java.io.RandomAccessFile.open(本机方法)
位于java.io.RandomAccessFile。(RandomAccessFile.java:212)
位于javax.imageio.stream.FileImageOutputStream。(FileImageOutputStream.java:53)
位于com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.java:37)
在javax.imageio.imageio.createImageOutputStream(imageio.java:393)
在javax.imageio.imageio.write(imageio.java:1514)
在myPackage.myClass.AfterPropertieSet(thisClassexample.java:204)//204是ImageIO写入的行号
这可能无法回答您的问题,因为您有限的信息可能还有许多其他可能性
如果同时满足以下四个条件,则无法在web应用程序中写入文件的一个常见可能性是Windows上的文件锁定问题:
web-INF
文件夹和这个技巧对于开发过程是有用的,比如你想编辑CSS文件,不需要重新启动你的Web应用程序就可以看到它的改变,但是它不适合生产模式。如果你的Web应用程序在生产过程中依赖这个技巧,那么你应该认真考虑重新设计你的代码。继续或为什么…我感觉这取决于
ImageIO
尝试保存图像的方式。您可以通过利用ByteArrayOutputStream
来保存BuffereImage
,如下所述:
BufferedImage bufferedImage = ImageIO.read(new File("sample_image.gif"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( bufferedImage, "gif", baos );
baos.flush(); //Is this necessary??
byte[] resultImageAsRawBytes = baos.toByteArray();
baos.close(); //Not sure how important this is...
OutputStream out = new FileOutputStream("myImageFile.gif");
out.write(resultImageAsRawBytes);
out.close();
我不是真的
BufferedImage bufferedImage = ImageIO.read(new File("sample_image.gif"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( bufferedImage, "gif", baos );
baos.flush(); //Is this necessary??
byte[] resultImageAsRawBytes = baos.toByteArray();
baos.close(); //Not sure how important this is...
OutputStream out = new FileOutputStream("myImageFile.gif");
out.write(resultImageAsRawBytes);
out.close();