sti*_*mpy 9 java file-io windows-7
我一直在撕扯头发,因此我寻求一些帮助.
我有一个代码循环执行以下操作
//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
}
Run Code Online (Sandbox Code Playgroud)
这一切都运行在Windows 7和JDK 1.6.26以及Netbeans,Tomcat 7.0.14上.目标目录实际上在我的netbeans项目目录中,位于普通Web应用程序(WEB-INF外部)的文件夹中,我希望通常有权写入文件.
当错误发生时,我得到文件a的两个结果之一.)所有错误b.)都是真的.除了isFile之外,父目录权限永远不会更改为true.
抛出的错误(带有"拒绝访问"的java.IO.error")每次都不会发生...实际上60%的循环运行时它不会引发错误.剩余的40%的时间我得到错误在它写的60多个文件中的1个.不经常相同的.它开始的URL的顺序每次都在变化,因此文件的编写顺序是可变的.文件名有简短的名称,如"1.png" ".图像很小......然后是8k.
为了确保权限是正确的,我有:
给net beans项目目录中的EVERYONE"完全控制"
以管理员身份运行JDK,JRE和Netbeans
已禁用UAC
但错误仍然存在.谷歌搜索这个似乎运行的范围,经常读作像vodoo.很明显,我(以及Java和Netbeans等)应该有权将文件写入目录.
有人有任何见解吗?这是封闭系统上的所有(代码和托管URL的Web服务器),因此我无法剪切和粘贴代码或堆栈跟踪.
更新:我通过在每次读取之前执行println和toString确认imageURL有效.然后我确认a.)托管目标URL的Web服务器返回带有http 200代码的图像b.)在Web浏览器中测试时,URL返回了图像.在测试中,我还在读取之后放入了一个if(),以确认值不是NULL或为空.我还对所有其他值进行了NULL测试.即使失败,它们总是如预期的那样.错误总是发生在try块内.目标目录在每次执行时都是相同的.在每次执行之前,目录都是空的.
更新2:这是堆栈跟踪之一(在这种情况下,file2Save的perms是R:True W:True E:True isFile:True存在: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
Run Code Online (Sandbox Code Playgroud)
这可能无法回答您的问题,因为您有限的信息可能还有许多其他可能性。
如果同时满足以下四个条件,则无法在 Web 应用程序中写入文件的一种常见可能性是 Windows 上的文件锁定问题:
WEB-INF文件夹和如果您尝试替换满足所有四个条件的文件,您将无法替换,因为某些 servlet 容器(例如 tomcat 和 jetty)会缓冲静态内容并锁定文件,因此您无法替换或更改它们。
如果您的 Web 应用程序恰好存在此问题,则不应使用默认 servlet 来提供文件内容。默认 servlet 被设计为提供您不想更改的静态内容,例如 css 文件、javascript 文件、背景图像等。
有一个技巧可以通过禁用 NIO 来解决 Windows 上 jetty 的文件锁定问题http://docs.codehaus.org/display/JETTY/Files+locked+on+Windows
该技巧对于开发过程很有用,例如您想要编辑 css 文件并在不重新启动 Web 应用程序的情况下查看更改,但不建议在生产模式中使用。如果你的网络应用程序在生产过程中依赖于这个技巧,那么你应该认真考虑重新设计你的代码。
| 归档时间: |
|
| 查看次数: |
13289 次 |
| 最近记录: |