[英]how to check database table permissions in java? (DataBase independently)
[英]How to check file permissions in Java (OS independently)
我有以下代码片段:
public class ExampleClass {
public static void main(String[] args) throws FileNotFoundException {
String filePath = args[0];
File file = new File(filePath);
if (!file.exists())
throw new FileNotFoundException();
if (file.canWrite())
System.out.println(file.getAbsolutePath() + ": CAN WRITE!!!");
else
System.out.println(file.getAbsolutePath() + ": CANNOT WRITE!!!!!");
if (file.canRead())
System.out.println(file.getAbsolutePath() + ": CAN READ!!!");
else
System.out.println(file.getAbsolutePath() + ": CANNOT READ!!!!!");
if (file.canExecute())
System.out.println(file.getAbsolutePath() + ": CAN EXECUTE!!!");
else
System.out.println(file.getAbsolutePath() + ": CANNOT EXECUTE!!!!!");
}
}
它适用于Linux操作系统,但问题是它在windows7中不起作用。 所以问题是:是否有人知道在Java OS中独立检查文件权限的方法?
这可能是由某种东西(例如反病毒产品)以不一致的方式“调解”文件访问引起的。
当然,很难相信Java File.canXxxx()
方法通常会在任何类型的Windows上被破坏。
更新 - 我把它拿回来。 阅读这篇Sun bug报告 ......然后哭泣。 简短的回答是它是一个Windows错误,Sun决定不解决它。 (但新的Java 7 API 确实有用......)
FWIW,我认为尝试检查这样的文件访问权限是不好的做法。 最好只是尝试使用该文件,并在发生时捕获异常。 有关我的推理,请参阅https://stackoverflow.com/a/6093037/139985 。 (现在我们有另一个原因......)
我已经对NIO API(来自Java 7)进行了一些测试,它们似乎完美无缺。
import java.io.FileNotFoundException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class PermissionCheck {
public static void main(String[] args) throws FileNotFoundException {
String filePath = args[0];
Path p = Paths.get(filePath);
if (Files.notExists(p))
throw new FileNotFoundException();
if (Files.isWritable(p))
...
if (Files.isReadable(p))
...
if (Files.isExecutable(p))
...
}
}
JDK:1.7.0_25,1.8.0_91
操作系统:Windows 7,8(64位)
首先,默认情况下,Java信任本地文件和untrust远程文件。 因此,在测试时,请注意您在家中的计算机上可以执行的操作,在公司服务器的某些远程驱动器中可能是不可能的。
其次,当我们检查远程驱动器上的文件权限时,通常仅在Windows资源管理器中设置它( 属性... - 只读 / 隐藏 / 存档等)是不够的。 例如,我的组织有其他机制来控制本地和远程文件权限,甚至作为我的PC的管理员也无法保证一切。 即使手动/以编程方式,您可以更改文件的权限,如果某些其他应用程序/组策略/ etc禁止您这样做,则更改可能会失败。 (例如, setReadable()
返回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
现在我可以读取此文件,编辑并保存。 在更改权限之前,我在保存时被要求另存为..
请注意,该文件是可读的,并且setReadable(false)
返回false
,并且该文件仍然可读。 JavaDoc的说这里是setReadable()
返回false
时用户没有权限更改访问premission,或当readable
已经是false
,和底层系统没有实现这一点。 调试到Java API并不提供太多信息,因为实现标记native
,无法看到更多信息。 但我有权改变可写性,所以这是我不明白的。
但是请注意, java.util.File
不支持更多属性,例如
。 也许你可以检查setHidden()
java.security
其他pacakges,比如AccessController ?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.