首先,默认情况下和设计上,Java 信任本地文件和不信任远程文件。因此,在测试时,请注意,您可以在家中的计算机上执行的操作,在您公司服务器的某些远程驱动器中可能是不可能的。
其次,当我们检查远程驱动器上的文件权限时,通常仅在 Windows 资源管理器中设置是不够的(Property...- Read only/ Hide/Archive等)。例如,我的组织有其他机制来控制本地和远程文件的权限,即使是我的 PC 的管理员也不能保证一切。即使您可以手动/以编程方式更改文件的权限,但如果某些其他应用程序/组策略/等禁止您这样做,更改可能会失败。(比如setReadable()
returns false
,表示不可能)比如我可以远程目录下execute
的一个txt
文件,意思是打开它,但是一个bat
同一目录中的文件不可执行,实际上,就我而言,当我想创建bat
文件时,我需要让我的管理员获得更多权限。我认为这可能bat
是禁止扩展。因为作为 Windows 中某个用户组中的用户,您的操作和运行的 JVM 受到比 JVM 本身更高的规则的限制。如果我错了,请纠正我。
但是,即使您可能无法设置文件的权限,现在您也可以在 Java 7 中正确读取它们。显然,在错误报告之后,Java 人员已经做了一些修复大部分的事情。我正在使用jdk 1.7.0_19
,为了测试,我做了以下事情:
在 Windows 资源管理器中将远程文件的属性设置为Read Only
和Hidden
。
从 Java 中阅读它,代码如下(来自 Stephen C 的链接并修改以查看setXxxxx()
方法是否可以工作)。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FilePermissionTester {
public static void main( String[] args ) throws IOException {
File file = new File("Y:\\some\\remote\\drive\\directoy\\xxxxx.txt");
System.out.println( "exists:" + file.exists() );
System.out.println( "is file:" + file.isFile() );
System.out.println( "can read:" + file.canRead() );
System.out.println( "can execute:" + file.canExecute() );
System.out.println( "can write:" + file.canWrite() );
System.out.println( "is hidden:" + file.isHidden() );
System.out.println("change it to be unreadable, and it works? " + file.setReadable(false));
System.out.println( "can read:" + file.canRead() );
System.out.println("change it to be writable, and it works? " + file.setWritable(true));
System.out.println( "can write:" + file.canWrite() );
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read();
fileInputStream.close();
}
}
我有:
exists:true
is file:true
can read:true
can execute:true
can write:false
is hidden:true
change it to be unreadable, and it works? false
can read:true
change it to be writable, and it works? true
can write:true
现在我可以读取这个文件,编辑它并保存它。在更改权限之前,我被要求Save As..保存时。
请注意,该文件是可读的,并且setReadable(false)
返回false
,并且该文件仍然是可读的。JavaDoc在这里说,当用户无权更改访问权限时返回,或者当setReadable()
已经是时,并且底层系统没有实现。调试到 Java API 并没有提供太多信息,因为实现被标记并且看不到更多信息。但是我有权更改可写性,所以我不明白。false
readable
false
native
但还要注意,还有更多不支持的属性java.util.File
,例如setHidden()
. 也许您可以检查其他包java.security
,例如AccessController?