在java中,我正在动态创建一组文件,并希望在linux/unix文件系统上更改这些文件的文件权限。我希望能够执行与 chmod . 这可能是Java5吗?如果是,怎么做?我知道在Java6中 File 对象具有 setReadable() / setWritable() 方法。我也知道我可以通过系统调用来实现这一点,但如果可能的话,我希望避免这样做。
chmod
File
setReadable()
setWritable()
mkh04yzy1#
Java7中提供了对文件属性的完全控制,作为“新”io工具(nio.2)的一部分。例如,posix权限可以通过 setPosixFilePermissions() ,或在创建文件时使用类似 createFile() 或 newByteChannel() .您可以使用创建一组权限 EnumSet.of() ,但helper方法 PosixFilePermissions.fromString() will使用一种传统的格式,对许多开发人员来说更具可读性。对于接受 FileAttribute ,您可以使用 Package 权限集 PosixFilePermissions.asFileAttribute() .
setPosixFilePermissions()
createFile()
newByteChannel()
EnumSet.of()
PosixFilePermissions.fromString()
FileAttribute
PosixFilePermissions.asFileAttribute()
Set<PosixFilePermission> ownerWritable = PosixFilePermissions.fromString("rw-r--r--");FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(ownerWritable);Files.createFile(path, permissions);
Set<PosixFilePermission> ownerWritable = PosixFilePermissions.fromString("rw-r--r--");
FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(ownerWritable);
Files.createFile(path, permissions);
在早期版本的java中,使用自己的本机代码,或 exec -调用命令行实用程序是常见的方法。
exec
6yoyoihd2#
除了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);}
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);
guicsvcw3#
在Java6之前,java级别不支持文件权限更新。您必须实现自己的本机方法或调用 Runtime.exec() 执行操作系统级命令,如chmod。从Java6开始,您可以使用 File.setReadable()/File.setWritable()/File.setExecutable() 设置文件权限。但是它没有模拟posix文件系统,它允许为不同的用户设置权限。file.set()仅允许为所有者和其他所有人设置权限。从Java7开始,引入了posix文件权限。您可以像在*nix系统上那样设置文件权限。语法是:
Runtime.exec()
File.setReadable()/File.setWritable()/File.setExecutable()
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 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系统上调用它。有关文件权限管理的详细信息,建议您阅读本文。
siv3szwd4#
对于使用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()));}
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()));
00jrzges5#
如果要对创建的文件设置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(File file) throws IOException{
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);
8iwquhpp6#
只是为了更新这个答案,除非以后有人遇到这个问题,因为您可以使用jdk 6
File file = new File('/directory/to/file');file.setWritable(boolean);file.setReadable(boolean);file.setExecutable(boolean);
File file = new File('/directory/to/file');
file.setWritable(boolean);
file.setReadable(boolean);
file.setExecutable(boolean);
您可以在oracle文件(java平台SE7)上找到文档。请记住,只有当前工作用户拥有该文件的所有权或写入权限时,这些命令才起作用。我知道op需要chmod类型的访问来进行更复杂的用户配置。这些将为所有用户设置全面的选项。
lkaoscv77#
您可以使用file类的方法:http://docs.oracle.com/javase/7/docs/api/java/io/file.html
nukf8bse8#
对于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(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下工作。
ngynwnxp9#
ApacheAnt 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();
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();
6yt4nkrj10#
oracle文档上有一个示例类,其工作原理与unix chmod非常相似。不过,它可以与JavaSE7+一起使用。
bpsygsoo11#
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(); }
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中更改文件权限
bbmckpt712#
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); }}
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 {
File file = new File("fileTest1.txt");
System.out.println(file.getAbsoluteFile());
//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);
file.delete();
} catch (IOException e) {
e.printStackTrace();
Path path = Paths.get(String.valueOf(file));
System.out.println(path);
12条答案
按热度按时间mkh04yzy1#
Java7中提供了对文件属性的完全控制,作为“新”io工具(nio.2)的一部分。例如,posix权限可以通过
setPosixFilePermissions()
,或在创建文件时使用类似createFile()
或newByteChannel()
.您可以使用创建一组权限
EnumSet.of()
,但helper方法PosixFilePermissions.fromString()
will使用一种传统的格式,对许多开发人员来说更具可读性。对于接受FileAttribute
,您可以使用 Package 权限集PosixFilePermissions.asFileAttribute()
.在早期版本的java中,使用自己的本机代码,或
exec
-调用命令行实用程序是常见的方法。6yoyoihd2#
除了erickson的建议之外,还有jna,它允许您在不使用jni的情况下调用本机库。它非常容易使用,我已经在几个项目中使用过,并取得了巨大的成功。
唯一需要注意的是,它比jni慢,因此,如果对大量文件执行此操作,可能会给您带来问题。
(编辑以添加示例)
下面是一个完整的jna chmod示例:
guicsvcw3#
在Java6之前,java级别不支持文件权限更新。您必须实现自己的本机方法或调用
Runtime.exec()
执行操作系统级命令,如chmod。从Java6开始,您可以使用
File.setReadable()/File.setWritable()/File.setExecutable()
设置文件权限。但是它没有模拟posix文件系统,它允许为不同的用户设置权限。file.set()仅允许为所有者和其他所有人设置权限。从Java7开始,引入了posix文件权限。您可以像在*nix系统上那样设置文件权限。语法是:
此方法只能在posix文件系统上使用,这意味着您无法在windows系统上调用它。
有关文件权限管理的详细信息,建议您阅读本文。
siv3szwd4#
对于使用nio 2的windows 7:
00jrzges5#
如果要对创建的文件设置777权限,可以使用以下方法:
8iwquhpp6#
只是为了更新这个答案,除非以后有人遇到这个问题,因为您可以使用jdk 6
您可以在oracle文件(java平台SE7)上找到文档。请记住,只有当前工作用户拥有该文件的所有权或写入权限时,这些命令才起作用。我知道op需要chmod类型的访问来进行更复杂的用户配置。这些将为所有用户设置全面的选项。
lkaoscv77#
您可以使用file类的方法:http://docs.oracle.com/javase/7/docs/api/java/io/file.html
nukf8bse8#
对于oralce java 6:
在solaris/linux下工作。
ngynwnxp9#
ApacheAnt chmod(不是很优雅,添加它是为了完整性)与@msorsky共享
6yt4nkrj10#
oracle文档上有一个示例类,其工作原理与unix chmod非常相似。不过,它可以与JavaSE7+一起使用。
bpsygsoo11#
参考:如何在java中更改文件权限
bbmckpt712#