policies - permisos java
¿Cómo cambio programáticamente los permisos de archivos? (11)
En Java, estoy creando dinámicamente un conjunto de archivos y me gustaría cambiar los permisos de archivos en estos archivos en un sistema de archivos de Linux / Unix. Me gustaría poder ejecutar el equivalente Java de chmod
. ¿Es posible Java 5? ¿Si es así, cómo?
Sé en Java 6 que el objeto File
tiene setReadable()
/ setWritable()
. También sé que podría hacer una llamada al sistema para hacer esto, pero me gustaría evitar eso si es posible.
Además de la respuesta de Erickson aquí un enlace útil con ejemplos de código de trabajo sobre el uso de PosixFilePermissions:
Además de las sugerencias de jna , también hay jna , que te permite llamar a bibliotecas nativas sin usar jni. Es asombrosamente fácil de usar, y lo he usado en un par de proyectos con gran éxito.
La única advertencia es que es más lento que jni, por lo que si estás haciendo esto a una gran cantidad de archivos que pueden ser un problema para ti.
(Edición para agregar un ejemplo)
Aquí hay un ejemplo completo de 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);
}
Antes de Java 6, no hay soporte para la actualización de permisos de archivos en Java. Debe implementar su propio método nativo o llamar a Runtime.exec()
para ejecutar el comando de nivel del sistema operativo, como chmod .
A partir de Java 6, puede usar File.setReadable()/File.setWritable()/File.setExecutable()
para establecer los permisos de archivo. Pero no simula el sistema de archivos POSIX que permite establecer permisos para diferentes usuarios. File.setXXX () solo permite establecer permisos para el propietario y todos los demás.
A partir de Java 7, se introduce el permiso de archivo POSIX. Puede configurar permisos de archivos como lo que ha hecho en los sistemas * nix. La sintaxis es:
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);
Este método solo se puede usar en el sistema de archivos POSIX, esto significa que no puede llamarlo en el sistema Windows.
Para obtener detalles sobre la gestión de permisos de archivos, le recomendamos que lea esta publicación .
Apache ant chmod (no muy elegante, agregándolo para completar) crédito compartido con @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();
El control total sobre los atributos de archivo está disponible en Java 7, como parte del "nuevo" NIO.2 New IO ( NIO.2 ). Por ejemplo, los permisos POSIX se pueden establecer con setPosixFilePermissions().
En versiones anteriores de Java, el uso de un código nativo propio o la exec
de utilidades de línea de comandos son enfoques comunes.
Hay una clase de ejemplo en Oracle Docs que funciona de manera muy similar al chmod de UNIX. Sin embargo, funciona con java se 7+.
Puede usar los métodos de la clase File: http://docs.oracle.com/javase/7/docs/api/java/io/File.html
Si desea establecer el permiso 777 para su archivo creado, entonces puede usar el siguiente método:
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);
}
para 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;
}
}
trabaja bajo Solaris / Linux.
para Windows 7 con 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()));
}
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();
}
Referencia: cómo cambiar el permiso de archivo en java