我想使用 Java 代码为图像文件赋予权限模式值“777”。我怎么能用Java给它呢?因为我无法删除默认权限模式“664”的图像。
5 回答
您可以使用 'exec' 方法运行外部命令来执行 chmod。
Runtime.getRuntime().exec( "chmod 777 myfile" );
您可以创建与文件关联的File对象,然后使用setExecutable、setReadable和setWritable更改权限。自然,如果您的程序无权更改文件的访问权限,这些操作将失败。
它是 NIO 包的一部分。您可以通过java.nio.file.attribute.PosixFilePermission来完成。
不幸的是,Java 很少抓住系统文件属性,因为它会打破 Java 的“一次编写,到处运行”的黄金法则。
事实上,当你写下你想要对文件进行 777 访问时,这显然意味着你在 unix 下。但是,例如在 Windows 下这样的请求意味着什么?
因此,要解决特定的操作系统主题,您必须使用特定的功能,这不足为奇。这是使用声称(有充分理由)“平台独立”的语言时要付出的代价
更安全的方法是使用完全实现您想要的 JNI 库。一种简单但又脏又危险的方法是使用 Runtime.getRuntime().exec("chmod 777 myFile")。
为什么危险?事实上,当调用这样的 exec("blahblah") 时会发生什么?
运行您的 java 程序的 unix 进程分叉;“重复”进程然后执行一个 shell(ksh ? csh ? bash ?? 这取决于您的 unix 配置),它试图理解和运行您的“blahblah”句子。
如果您的 jvm 实际上使用 500 MB,则分叉的进程在启动时将具有相同的大小...
然后 shell 将以与 java 进程相同的“shell 上下文”开始,即相同的 PATH、别名等。甚至“chmod”也可能是别名,因此最好调用 chmod 的完整路径(/bin/chmod、/usr/bin/chmod...这取决于 unix 风格...)。
在 shell 执行期间,您的 java 程序被冻结,如果由于任何原因 shell 挂起,您将无法解冻它。
最后,甚至不确定 java 程序的 unix 所有者是否有足够的权限来更改文件上的此类信息(例如,他可以被允许创建文件,但不能更改用户级别的权限)。
也许您尝试在 java 级别处理应该在操作系统级别解决的问题?
代码如下:-
List<String> chPermList = new LinkedList<String>();
chPermList.add("/bin/chmod");
chPermList.add("777");
chPermList.add(Path_to_image_file);
public void changePermission(List chPermList)
{
ProcessBuilder pb = null;
pb = new ProcessBuilder(chPermList);
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p
.getInputStream()));
p.waitFor();
if(p.exitValue()!=0)
{
strExpMsg = "The permission change failed with exit value" + p.exitValue();
}
}