6

尝试在安装在 unix 系统上的窗口文件夹上写入文件时,我遇到了帖子的标题错误。我开发了一个 Web 服务,它在 Linux 操作系统上的 Tomcat 6 内运行,需要在 Windows 网络文件夹上写入。系统管理员已将其安装在 Linux 服务器上,并且在其上创建和修改文件没有问题。当我尝试执行发布的代码时,出现以下异常:

Permission denied java.io.IOException: Permission denied at java.io.UnixFileSystem.createFileExclusively(Native Method) at java.io.File.createNewFile(File.java:850)

奇怪的是,它似乎与网络文件夹上的 File.createNewFile 方法有关,实际上该服务可以毫无问题地写入本地文件系统,无论是在调试(我用来开发服务的电脑)和 tomcat 上文件夹系统管理员在 linux 服务器上为我提供了。该文件已创建但为空,并且未打印 create 方法后面的日志条目。此外,如果我使用普通的输出流来创建和写入文件,我没有问题。

我在网上找不到有关异常的任何解释。由于我对 java 不是很有经验,我想了解为什么会出现此错误。我是否以错误的方式使用它?这是图书馆的错误吗?我想传递一些参数吗?如前所述,我已经使用普通的输出流解决了这个问题,这是一个提高我对 java 理解的问题。

FileOutputStream fos = null; 
try{ 

   log.info(String.format("file length: %s",streamAttach.length)); 
   log.info(String.format("check File : %s",filename)); 
   File f = new File(filename); 
   if(f.exists()) 
    ...                        

   boolean done= f.createNewFile();//here comes the exception
   //nothing of the following happens 
   if(!done) 
       throw new NWSException("error creating file"); 
   log.info(String.format("file %s creato", nomeFile)); 

提前感谢您的任何回答

4

3 回答 3

5

我最近遇到了这个问题,发现java.io.File.createNewFile()实际上需要“更改权限”权限(检查文件夹权限时可以在Security->Advanced下找到该条目)。如果没有这个,它将创建文件,然后抛出一个 IOException。

这是具有欺骗性的,因为您仍然可以在手动测试时在文件夹上创建文件,但是如果 createNewFile() 没有此特定权限(大概这样它可以更改其创建的文件的权限),它仍然会失败。

于 2011-09-05T00:36:37.923 回答
3

如果您使用与 Unix 共享 NTFS (CIFS) 样式文件系统的 Netapp,您可能会遇到“不允许 NFS 更改 NTFS 样式安全卷中文件的权限”。( TR-3490第 16 页)

此处的选项是更改为 unix 文件系统或将cifs.ntfs_ignore_unix_security_ops标志设置为 on 以消除 NFS 权限错误的文件系统。

java.io.UnixFileSystem.createFileExclusively(Native Method)使用 O_EXCL 和 0666 umask 打开文件,所以我会得到一个EACCES,这实际上是一个NFS3RR_ACCES

open("/net/storage01-a/filer/myfile", O_RDWR|O_CREAT|O_EXCL, 0666) Err#13 EACCES

您也可以使用 OutputStream 创建文件,它似乎不使用 O_EXCL

于 2013-09-10T08:39:23.633 回答
2

它绝对不是 Java 特有的问题。如果此 Unix 文件夹映射到您的窗口,请尝试打开文件资源管理器并在此目录中创建文件。我相信您也会获得许可被拒绝。在这种情况下,请解决此问题或请您的系统管理员帮助您。

祝你好运!

于 2011-02-09T11:26:37.230 回答