1. Basisattribute lesen: BasicFileAttributes
Wenn wir über eine Datei oder einen Ordner sprechen, meinen wir nicht nur Name oder Größe. Jede Datei hat einen „Pass“ – einen Satz von Attributen, der enthält:
- Erstellungszeit
- Zeit der letzten Änderung
- Zeit des letzten Zugriffs
- Größe
- Zugriffsrechte (wer lesen, schreiben, ausführen darf)
- Informationen zum Besitzer (unter Unix)
- Kennzeichen „versteckt“, „schreibgeschützt“ usw.
In Java gibt es für die Arbeit mit diesen Attributen eine praktische und leistungsfähige API im Paket java.nio.file.attribute. Sie müssen keinen plattformspezifischen Code schreiben: Alles Nötige ist in der Standardbibliothek enthalten.
Zunächst – die benötigten Klassen importieren:
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException;
Wie erhält man die Basisattribute einer Datei?
Wir verwenden die Methode Files.readAttributes:
Path path = Paths.get("example.txt");
try {
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("Erstellt: " + attrs.creationTime());
System.out.println("Geändert: " + attrs.lastModifiedTime());
System.out.println("Letzter Zugriff: " + attrs.lastAccessTime());
System.out.println("Größe: " + attrs.size());
System.out.println("Ist es ein Verzeichnis? " + attrs.isDirectory());
System.out.println("Ist es eine reguläre Datei? " + attrs.isRegularFile());
System.out.println("Ist es ein symbolischer Link? " + attrs.isSymbolicLink());
} catch (IOException e) {
System.out.println("Fehler beim Lesen der Attribute: " + e.getMessage());
}
Stellen Sie sich vor, Sie sind Inspektor und kommen, um eine Wohnung zu prüfen. Sie schauen nicht nur, ob es eine Tür gibt (die Datei existiert), sondern fragen die Bewohner: „Wann wurde das Haus gebaut? Wann wurde zuletzt renoviert? Wem gehört es?“
Kurz zu den Eigenschaften von BasicFileAttributes
| Eigenschaft | Was wird zurückgegeben? |
|---|---|
|
Datum und Uhrzeit der Erstellung der Datei/des Ordners |
|
Datum und Uhrzeit der letzten Änderung |
|
Datum und Uhrzeit des letzten Zugriffs |
|
Dateigröße (in Bytes) |
|
Ist es ein Verzeichnis? |
|
Ist es eine reguläre Datei? |
|
Ist es ein symbolischer Link? |
2. Erweiterte Attribute: POSIX und DOS
POSIX-Attribute (Linux, macOS und andere Unix-ähnliche Betriebssysteme)
Wenn Sie auf einem Unix-System arbeiten, können Sie erweiterte Informationen abrufen: Zugriffsrechte, Eigentümer, Gruppe.
try {
PosixFileAttributes posixAttrs = Files.readAttributes(path, PosixFileAttributes.class);
System.out.println("Besitzer: " + posixAttrs.owner().getName());
System.out.println("Gruppe: " + posixAttrs.group().getName());
System.out.println("Berechtigungen: " + PosixFilePermissions.toString(posixAttrs.permissions()));
} catch (UnsupportedOperationException e) {
System.out.println("POSIX-Attribute werden auf diesem Betriebssystem nicht unterstützt.");
} catch (IOException e) {
System.out.println("Fehler beim Lesen der POSIX-Attribute: " + e.getMessage());
}
Hinweis: Unter Windows löst dieser Code eine UnsupportedOperationException aus – das ist normal.
DOS-Attribute (Windows)
Unter Windows kann man mit den Kennzeichen „schreibgeschützt“, „versteckt“, „archiviert“, „System“ arbeiten:
try {
DosFileAttributes dosAttrs = Files.readAttributes(path, DosFileAttributes.class);
System.out.println("Versteckt: " + dosAttrs.isHidden());
System.out.println("Schreibgeschützt: " + dosAttrs.isReadOnly());
System.out.println("System: " + dosAttrs.isSystem());
System.out.println("Archiviert: " + dosAttrs.isArchive());
} catch (UnsupportedOperationException e) {
System.out.println("DOS-Attribute werden auf diesem Betriebssystem nicht unterstützt.");
} catch (IOException e) {
System.out.println("Fehler beim Lesen der DOS-Attribute: " + e.getMessage());
}
3. Ändern von Dateiattributen
Fremde Pässe lesen ist das eine, das Geburtsdatum oder den Nachnamen zu ändern etwas ganz anderes! In Java können wir Dateiattribute ändern (natürlich nur mit den erforderlichen Berechtigungen).
Änderung des letzten Änderungszeitpunkts
import java.nio.file.attribute.FileTime;
Path file = Paths.get("example.txt");
try {
FileTime newTime = FileTime.fromMillis(System.currentTimeMillis() - 24 * 60 * 60 * 1000); // minus 1 Tag
Files.setLastModifiedTime(file, newTime);
System.out.println("Zeitpunkt der letzten Änderung aktualisiert!");
} catch (IOException e) {
System.out.println("Fehler beim Ändern der Zeit: " + e.getMessage());
}
Berechtigungen ändern (POSIX)
Nur für Unix-Systeme! Beispielsweise eine Datei für alle ausführbar machen:
try {
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-xr-x");
Files.setPosixFilePermissions(file, perms);
System.out.println("Berechtigungen geändert!");
} catch (UnsupportedOperationException e) {
System.out.println("POSIX-Berechtigungen werden auf diesem Betriebssystem nicht unterstützt.");
} catch (IOException e) {
System.out.println("Fehler beim Ändern der Berechtigungen: " + e.getMessage());
}
Erläuterung zur Zeichenfolge "rwxr-xr-x":
- r — read (Lesen)
- w — write (Schreiben)
- x — execute (Ausführen)
- Der erste Block aus 3 Zeichen – Besitzer, der zweite – Gruppe, der dritte – andere.
Status „versteckt/schreibgeschützt“ ändern (DOS-Attribute, Windows)
Datei versteckt setzen:
try {
Files.setAttribute(file, "dos:hidden", true);
System.out.println("Datei wurde versteckt (Windows)!");
} catch (UnsupportedOperationException e) {
System.out.println("DOS-Attribute werden auf diesem Betriebssystem nicht unterstützt.");
} catch (IOException e) {
System.out.println("Fehler beim Ändern des Attributs: " + e.getMessage());
}
Datei „schreibgeschützt“ setzen:
try {
Files.setAttribute(file, "dos:readonly", true);
System.out.println("Datei ist jetzt schreibgeschützt (Windows)!");
} catch (UnsupportedOperationException e) {
System.out.println("DOS-Attribute werden auf diesem Betriebssystem nicht unterstützt.");
} catch (IOException e) {
System.out.println("Fehler beim Ändern des Attributs: " + e.getMessage());
}
4. Zugriffsrechte prüfen
Manchmal ist es wichtig, schnell zu prüfen, ob eine Datei zum Lesen, Schreiben oder Ausführen geöffnet werden kann:
Path file = Paths.get("example.txt");
System.out.println("Lesen erlaubt: " + Files.isReadable(file));
System.out.println("Schreiben erlaubt: " + Files.isWritable(file));
System.out.println("Ausführen erlaubt: " + Files.isExecutable(file));
Das funktioniert auf allen Plattformen gleich, auch wenn das tatsächliche Verhalten vom Betriebssystem und den Sicherheitsrichtlinien abhängt.
5. Praxis: Ausgeben detaillierter Informationen über eine Datei
Schreiben wir ein kleines Programm, das zu einem Dateipfad möglichst viele Informationen anzeigt und versucht, einige Attribute zu ändern.
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.util.Set;
import java.io.IOException;
public class FileAttributesDemo {
public static void main(String[] args) throws IOException {
Path path = Paths.get("example.txt");
if (!Files.exists(path)) {
System.out.println("Datei nicht gefunden!");
return;
}
// Basisattribute
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("Name: " + path.getFileName());
System.out.println("Pfad: " + path.toAbsolutePath());
System.out.println("Größe: " + attrs.size() + " Byte");
System.out.println("Erstellt: " + attrs.creationTime());
System.out.println("Geändert: " + attrs.lastModifiedTime());
System.out.println("Letzter Zugriff: " + attrs.lastAccessTime());
System.out.println("Ist es ein Verzeichnis? " + attrs.isDirectory());
System.out.println("Ist es eine reguläre Datei? " + attrs.isRegularFile());
// Zugriffsrechte prüfen
System.out.println("Lesen erlaubt: " + Files.isReadable(path));
System.out.println("Schreiben erlaubt: " + Files.isWritable(path));
System.out.println("Ausführen erlaubt: " + Files.isExecutable(path));
// Versuchen wir, den Änderungszeitpunkt zu aktualisieren
FileTime now = FileTime.fromMillis(System.currentTimeMillis());
Files.setLastModifiedTime(path, now);
System.out.println("Zeitpunkt der letzten Änderung aktualisiert!");
// Versuchen wir, die Datei zu verstecken (falls unterstützt)
try {
Files.setAttribute(path, "dos:hidden", true);
System.out.println("Datei wurde versteckt (falls vom Betriebssystem unterstützt).");
} catch (UnsupportedOperationException e) {
System.out.println("Versteckte Dateien werden auf diesem Betriebssystem nicht unterstützt.");
}
// Versuchen wir, POSIX-Berechtigungen auszugeben (falls unterstützt)
try {
PosixFileAttributes posixAttrs = Files.readAttributes(path, PosixFileAttributes.class);
System.out.println("Besitzer: " + posixAttrs.owner().getName());
System.out.println("Berechtigungen: " + PosixFilePermissions.toString(posixAttrs.permissions()));
} catch (UnsupportedOperationException e) {
System.out.println("POSIX-Attribute werden auf diesem Betriebssystem nicht unterstützt.");
}
}
}
6. Nützliche Besonderheiten
Plattformübergreifende Unterschiede und Tipps
- Nicht alle Attribute sind auf allen Betriebssystemen verfügbar! Unter Windows gibt es keine POSIX-Rechte, unter Linux keine DOS-Attribute.
- Verwenden Sie stets try-catch! Methoden können UnsupportedOperationException oder IOException auslösen.
- Zugriffsrechte sind nicht immer nur „rwx“! Unter Windows ist das Berechtigungsmodell anders; „schreibgeschützt“ kann durch die Sicherheitsrichtlinien des Betriebssystems bestimmt werden.
- Versteckte Dateien sind ein relatives Konzept. Unter Unix ist eine Datei versteckt, wenn der Name mit einem Punkt beginnt (.hidden), unter Windows – wenn das Attribut dos:hidden gesetzt ist.
Tabelle: Welche Attribute wo verfügbar sind
| Attribut | Windows (dos:*) | Linux/macOS (posix:*) |
|---|---|---|
| Erstellungszeit | + | + |
| Zeit der letzten Änderung | + | + |
| Zeit des letzten Zugriffs | + | + |
| Versteckte Datei | + | Nur Name mit Punkt |
| Schreibgeschützt | + | + |
| Berechtigungen (rwx) | - | + |
| Besitzer, Gruppe | - | + |
| Archiviert, System | + | - |
7. Typische Fehler beim Arbeiten mit Dateiattributen
Fehler Nr. 1: Versuch, POSIX-Attribute unter Windows zu lesen oder zu ändern. Unter Windows erhalten Sie UnsupportedOperationException. Behandeln Sie diese Ausnahme immer, wenn Sie plattformübergreifenden Code schreiben.
Fehler Nr. 2: Änderung des Änderungszeitpunkts einer Datei, die von einem anderen Prozess geöffnet ist. In manchen Systemen kann die Datei gesperrt sein und der Vorgang schlägt fehl.
Fehler Nr. 3: Die Erwartung, dass die Operation „Datei verstecken“ auf allen Betriebssystemen gleich funktioniert. Unter Unix ist eine Datei versteckt, wenn sie mit einem Punkt beginnt (.gitignore), unter Windows – wenn das Attribut dos:hidden gesetzt ist. Verwechseln Sie diese Ansätze nicht.
Fehler Nr. 4: Vernachlässigen der Existenzprüfung vor der Operation. Wenn die Datei nicht existiert, erhalten Sie NoSuchFileException beim Abrufen oder Ändern von Attributen.
Fehler Nr. 5: Keine Prüfung der Zugriffsrechte. Wenn der Benutzer keine Rechte zum Ändern von Attributen hat, schlägt der Vorgang fehl. Prüfen Sie vor Änderungen Files.isWritable(path).
GO TO FULL VERSION