我如何以编程方式更改文件权限?
在Java中,我动态地创建了一组文件,我想在linux / unix文件系统上更改这些文件的文件权限。 我希望能够执行chmod
的Java等价物。 那可能是Java 5吗? 如果是这样,怎么样?
我知道在Java 6中,File对象具有setReadable()/ setWritable()方法。 我也知道我可以做一个系统调用来做到这一点,但如果可能的话,我想避免这种情况。
作为“新”新IO设施( NIO.2 )的一部分,可以在Java 7中完全控制文件属性。 例如,可以使用setPosixFilePermissions()
来设置POSIX权限。
在早期的Java版本中,使用自己的本地代码或者exec
-ing命令行工具是常用的方法。
除了erickson的建议之外,还有jna ,它允许你在不使用jni的情况下调用本地库。 使用起来非常容易,我已经在一些项目上使用了它,取得了很大的成功。
唯一需要注意的是它比jni慢,所以如果你这样做了大量的文件可能是你的问题。
(编辑添加示例)
这里有一个完整的jna chmod例子:
import com.sun.jna.Library; import com.sun.jna.Native; public class Main { private static CLibrary libc = (CLibrary) Native.loadLibrary("c", CLibrary.class); public static void main(String[] args) { libc.chmod("/path/to/file", 0755); } } interface CLibrary extends Library { public int chmod(String path, int mode); }
对于Windows 7与NIO 2.0:
public static void main(String[] args) throws IOException { Path file = Paths.get("c:/touch.txt"); AclFileAttributeView aclAttr = Files.getFileAttributeView(file, AclFileAttributeView.class); System.out.println(aclAttr.getOwner()); for(AclEntry aclEntry : aclAttr.getAcl()){ System.out.println(aclEntry); } System.out.println(); UserPrincipalLookupService upls = file.getFileSystem().getUserPrincipalLookupService(); UserPrincipal user = upls.lookupPrincipalByName(System.getProperty("user.name")); AclEntry.Builder builder = AclEntry.newBuilder(); builder.setPermissions( EnumSet.of(AclEntryPermission.READ_DATA, AclEntryPermission.EXECUTE, AclEntryPermission.READ_ACL, AclEntryPermission.READ_ATTRIBUTES, AclEntryPermission.READ_NAMED_ATTRS, AclEntryPermission.WRITE_ACL, AclEntryPermission.DELETE )); builder.setPrincipal(user); builder.setType(AclEntryType.ALLOW); aclAttr.setAcl(Collections.singletonList(builder.build())); }
在Java 6之前,在Java级别上不支持文件权限更新。 您必须实现自己的本地方法或调用Runtime.exec()
来执行操作系统级别的命令,如chmod 。
从Java 6开始,可以使用File.setReadable()/File.setWritable()/File.setExecutable()
来设置文件权限。 但是它并不模拟允许为不同用户设置权限的POSIX文件系统。 File.setXXX()只允许为所有者和其他人设置权限。
从Java 7开始,引入了POSIX文件权限。 您可以像设置* nix系统一样设置文件权限。 语法是:
File file = new File("file4.txt"); file.createNewFile(); Set<PosixFilePermission> perms = new HashSet<>(); perms.add(PosixFilePermission.OWNER_READ); perms.add(PosixFilePermission.OWNER_WRITE); Files.setPosixFilePermissions(file.toPath(), perms);
此方法只能在POSIX文件系统上使用,这意味着您不能在Windows系统上调用它。
有关文件权限管理的详细信息,建议您阅读本文 。
如果您想要为创建的文件设置777权限,则可以使用以下方法:
public void setPermission(File file) throws IOException{ Set<PosixFilePermission> perms = new HashSet<>(); perms.add(PosixFilePermission.OWNER_READ); perms.add(PosixFilePermission.OWNER_WRITE); perms.add(PosixFilePermission.OWNER_EXECUTE); perms.add(PosixFilePermission.OTHERS_READ); perms.add(PosixFilePermission.OTHERS_WRITE); perms.add(PosixFilePermission.OWNER_EXECUTE); perms.add(PosixFilePermission.GROUP_READ); perms.add(PosixFilePermission.GROUP_WRITE); perms.add(PosixFilePermission.GROUP_EXECUTE); Files.setPosixFilePermissions(file.toPath(), perms); }
对于Oralce Java 6:
private static int chmod(String filename, int mode) { try { Class<?> fspClass = Class.forName("java.util.prefs.FileSystemPreferences"); Method chmodMethod = fspClass.getDeclaredMethod("chmod", String.class, Integer.TYPE); chmodMethod.setAccessible(true); return (Integer)chmodMethod.invoke(null, filename, mode); } catch (Throwable ex) { return -1; } }
在solaris / linux下运行。
您可以使用File类的方法: http : //docs.oracle.com/javase/7/docs/api/java/io/File.html
除了erickson的答案这里有一个有用的链接与工作代码示例使用PosixFilePermissions:
Apache蚂蚁chmod(不是很优雅,加上它的完整性)信用与@msorsky共享
Chmod chmod = new Chmod(); chmod.setProject(new Project()); FileSet mySet = new FileSet(); mySet.setDir(new File("/my/path")); mySet.setIncludes("**"); chmod.addFileset(mySet); chmod.setPerm("+w"); chmod.setType(new FileDirBoth()); chmod.execute();
simple java code for change file permission in java String path="D:\\file\\read.txt"; File file=new File(path); if (file.exists()) { System.out.println("read="+file.canRead()); System.out.println("write="+file.canWrite()); System.out.println("Execute="+file.canExecute()); file.setReadOnly(); }
参考: 如何在java中更改文件权限
Oracle Docs上有一个与UNIX chmod非常类似的示例类 。 它与java se 7+虽然工作。