Answers:
作为“新” New IO工具(NIO.2)的一部分,Java 7中提供了对文件属性的完全控制。例如,POSIX权限可以在与现有的文件设置setPosixFilePermissions()
,在文件创建与类似的方法或原子createFile()
或newByteChannel()
。
您可以使用来创建一组权限EnumSet.of()
,但是helper方法PosixFilePermissions.fromString()
将使用一种常规格式,该格式对于许多开发人员而言更易读。对于接受的API FileAttribute
,您可以使用来包装权限集PosixFilePermissions.asFileAttribute()
。
Set<PosixFilePermission> ownerWritable = PosixFilePermissions.fromString("rw-r--r--");
FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(ownerWritable);
Files.createFile(path, permissions);
在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);
}
在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系统上调用它。
有关文件权限管理的详细信息,建议您阅读这篇文章。
对于带有Nio 2.0的Windows 7:
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()));
}
如果要对创建的文件设置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.OTHERS_EXECUTE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_EXECUTE);
Files.setPosixFilePermissions(file.toPath(), perms);
}
只是为了更新此答案,除非以后有人遇到此问题,因为您可以使用JDK 6
File file = new File('/directory/to/file');
file.setWritable(boolean);
file.setReadable(boolean);
file.setExecutable(boolean);
您可以在Oracle File(Java Platform SE 7)上找到文档。请记住,这些命令仅在当前工作用户拥有该文件的所有权或写入权限时才起作用。我知道OP希望使用chmod类型访问以实现更复杂的用户配置。这些将为所有用户全面设置选项。
您可以使用File类的方法:http : //docs.oracle.com/javase/7/docs/api/java/io/File.html
对于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下工作。
FileSystemPreferences
闪烁Timer
。它还添加了一个关闭钩子,但是对于某些应用程序来说,这仍然是有问题的。
与@msorsky共享的Apache ant chmod(不是很优雅,添加了完整性)
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();
}
Oracle Docs上有一个示例类,其工作原理与UNIX chmod非常相似。它可以与Java SE 7+一起使用。
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;
public class FileAndDirectory1 {
public static void main(String[] args) {
File file = new File("fileTest1.txt");
System.out.println(file.getAbsoluteFile());
try {
//file.createNewFile();
if(!file.exists())
{
//PosixFilePermission is an enum class, PosixFilePermissions is a final class
//create file permissions from string
Set<PosixFilePermission> filePermissions = PosixFilePermissions.fromString("---------"/* "rwxrwxrwx" */);
FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(filePermissions);
Files.createFile(file.toPath(), permissions);
// printing the permissions associated with the file
System.out.println("Executable: " + file.canExecute());
System.out.println("Readable: " + file.canRead());
System.out.println("Writable: "+ file.canWrite());
file.setExecutable(true);
file.setReadable(true);
file.setWritable(true);
}
else
{
//modify permissions
//get the permission using file attributes
Set<PosixFilePermission> perms = Files.readAttributes(file.toPath(), PosixFileAttributes.class).permissions();
perms.remove(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_EXECUTE);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_EXECUTE);
perms.add(PosixFilePermission.OTHERS_WRITE);
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_EXECUTE);
Files.setPosixFilePermissions(file.toPath(), perms);
System.out.println("Executable: " + file.canExecute());
System.out.println("Readable: " + file.canRead());
System.out.println("Writable: "+ file.canWrite());
file.delete();
}
} catch (IOException e) {
e.printStackTrace();
}
Path path = Paths.get(String.valueOf(file));
System.out.println(path);
}
}
Files.setPosixFilePermissions(path, PosixFilePermissions.fromString("rwxr-x---"))