Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式更改文件权限?_Java_Filesystems - Fatal编程技术网

Java 如何以编程方式更改文件权限?

Java 如何以编程方式更改文件权限?,java,filesystems,Java,Filesystems,在Java中,我正在动态创建一组文件,并希望在linux/unix文件系统上更改这些文件的文件权限。我希望能够执行Java等价的chmod。这可能是Java5吗?如果是,怎么做 我知道在Java 6中,文件对象具有setReadable()/setWritable()方法。我也知道我可以通过系统调用来实现这一点,但如果可能的话,我希望避免这样做 Java 7中提供了对文件属性的完全控制,作为“新”IO功能()的一部分。例如,POSIX权限可以通过或在文件创建时通过或等方法在现有文件上设置 您可以

在Java中,我正在动态创建一组文件,并希望在linux/unix文件系统上更改这些文件的文件权限。我希望能够执行Java等价的
chmod
。这可能是Java5吗?如果是,怎么做


我知道在Java 6中,
文件
对象具有
setReadable()
/
setWritable()
方法。我也知道我可以通过系统调用来实现这一点,但如果可能的话,我希望避免这样做

Java 7中提供了对文件属性的完全控制,作为“新”IO功能()的一部分。例如,POSIX权限可以通过或在文件创建时通过或等方法在现有文件上设置

您可以使用
EnumSet.of()
创建一组权限,但是helper方法将使用常规格式,这对许多开发人员来说更具可读性。对于接受
FileAttribute
的API,可以使用包装权限集

Set ownerWritable=PosixFilePermissions.fromString(“rw-r--r--”);
FileAttribute permissions=PosixFilePermissions.asFileAttribute(ownerWritable);
Files.createFile(路径、权限);

在Java的早期版本中,使用您自己的本机代码,或者使用命令行实用程序是常见的方法。

除了erickson的建议之外,还有一种方法,允许您在不使用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);
}

您可以使用File类的方法:
对于带有NIO 2的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()));
}
对于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;
    }
}
private static int chmod(字符串文件名,int模式){
试一试{
类fspClass=Class.forName(“java.util.prefs.FileSystemPreferences”);
方法chmodMethod=fspClass.getDeclaredMethod(“chmod”,String.class,Integer.TYPE);
chmodMethod.setAccessible(true);
返回(整数)chmodMethod.invoke(null、文件名、模式);
}捕获(可丢弃的ex){
返回-1;
}
}
在solaris/linux下工作。

Apache ant 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();

在Java6之前,Java级别不支持文件权限更新。您必须实现自己的本机方法或调用
Runtime.exec()
来执行操作系统级命令,如chmod

从Java 6开始,可以使用
File.setReadable()/File.setWritable()/File.setExecutable()
设置文件权限。但是它没有模拟POSIX文件系统,它允许为不同的用户设置权限。File.setXXX()仅允许为所有者和其他所有人设置权限

从Java7开始,引入了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);
File File=new文件(“file4.txt”);
createNewFile();
Set perms=new HashSet();
perms.add(PosixFilePermission.OWNER\u READ);
perms.add(PosixFilePermission.OWNER\u WRITE);
Files.setPosixFilePermissions(file.toPath(),perms);
此方法只能在POSIX文件系统上使用,这意味着您无法在Windows系统上调用它

有关文件权限管理的详细信息,建议您阅读。

有一种类似于UNIX chmod的方法。不过,它可以与JavaSE7+一起使用

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();
        }     

参考:

如果要对创建的文件设置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);
}
public void setPermission(文件)引发IOException{
Set perms=new HashSet();
perms.add(PosixFilePermission.OWNER\u READ);
perms.add(PosixFilePermission.OWNER\u WRITE);
perms.add(PosixFilePermission.OWNER\u 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\u 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上找到文档。请记住,只有当前工作用户拥有该文件的所有权或写入权限时,这些命令才起作用。我知道OP需要chmod类型的访问来进行更复杂的用户配置。这些将为所有用户设置全面的选项。

import java.io.File;
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);
    }
}
导入java.io.IOException; 导入java.nio.file.Files; 导入java.nio.file.Path; 导入java.nio.file.path; 导入java.nio.file.attribute.FileAttribute; 导入java.nio.file.attribute.PosixFileAttributes; 导入java.nio.file.attribute.PosixFilePermission; 导入java.nio.file.attribute.PosixFilePermissions; 导入java.util.Set; 公共类FileAndDirectory1{ 公共静态void main(字符串[]args){ File File=新文件(“fileTest1.txt”); System.out.println(file.getAbsoluteFile()); 试一试{ //createNewFile(); 如果(!file.exists()) { //PosixFilePermission是一个枚举类,PosixFilePermissions是最后一个类 //从字符串创建文件权限 Set filePermissions=PosixFilePermissions.fromString(“-----------”/*“rwxrwxrwx”*/); FileAttribute permissions=PosixFilePermissions.asFileAttribute(filePermissions); Files.createFile(file.toPath(),权限); //打印与文件关联的权限 System.out.println(“可执行文件:“+file.canExecute());
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);
    }
}