Ich werde die sehr gute Antwort von vervollständigen @mmcrae
.
Gibt es einen Grund mehr, ein java.io.File-Objekt zu verwenden, oder können wir es als veraltet betrachten?
JDK-Klassen werden sehr selten veraltet.
In der Liste der veralteten JDK 8-APIs werden alle Klassen angezeigt, die seit dem ersten JDK veraltet sind.
Es enthält nur einen kleinen Teil der Klassen, von deren Verwendung die Oracle-Dokumentation und die Java-Community abraten.
java.util.Date
, java.util.Vector
, java.util.Hashtable
... , das sind Klassen mit so vielen Mängel nicht veraltet sind.
Aber wieso ?
Denn konzeptionell gibt es noch etwas von deprecated
Mitteln, aber es wird davon abgeraten, es zu verwenden, da es mit ziemlicher Sicherheit entfernt wird.
Tausende Programme verlassen sich auf diese schlecht gestalteten Klassen.
Für solche Klassen geben Java-API-Entwickler kein solches Signal.
Antwort von @EJP
ist so wirklich richtig:
Nicht, solange und bis es im Javadoc so markiert ist.
Ich denke also, dass Ihre Frage in ihren Begriffen sinnvoller wäre:
"Wenn wir die Wahl haben, sollten wir sie verwenden java.io.File
oder java.nio.file.Path
für neue Entwicklungen, und wenn die Antwort lautet java.nio.file.Path
, könnten Sie sie java.io.File
für ältere Projekte leicht nutzen java.io.File
?"
Ich glaube, ein java.nio.file.Path kann alles, was ein java.io.File kann und noch mehr.
Du hast die Antwort.
Dieses Orakel-Tutorial über Legacy-E / A bestätigt Ihr Denken.
Vor der Veröffentlichung von Java SE 7 war die java.io.File
Klasse der Mechanismus, der für Datei-E / A verwendet wurde, hatte jedoch mehrere Nachteile.
Viele Methoden haben keine Ausnahmen ausgelöst, als sie fehlschlugen, sodass es unmöglich war, eine nützliche Fehlermeldung zu erhalten. Wenn beispielsweise das Löschen einer Datei fehlschlug, erhielt das Programm einen "Löschfehler", wusste jedoch nicht, ob dies daran lag, dass die Datei nicht vorhanden war, der Benutzer keine Berechtigungen hatte oder ein anderes Problem auftrat.
Die Umbenennungsmethode funktionierte plattformübergreifend nicht konsistent. Es gab keine wirkliche Unterstützung für symbolische Links.
Es wurde mehr Unterstützung für Metadaten gewünscht, z. B. Dateiberechtigungen, Dateieigentümer und andere Sicherheitsattribute.
Der Zugriff auf Dateimetadaten war ineffizient.
Viele der File-Methoden wurden nicht skaliert. Das Anfordern einer großen Verzeichnisliste über einen Server kann zu einem Stillstand führen. Große Verzeichnisse können auch Probleme mit Speicherressourcen verursachen und zu einem Denial-of-Service führen.
Es war nicht möglich, zuverlässigen Code zu schreiben, der rekursiv durch einen Dateibaum laufen und angemessen reagieren konnte, wenn kreisförmige symbolische Links vorhanden waren.
Bei so vielen Nachteilen java.io.File
brauchen wir wirklich keinen Grund, diese Klasse für neue Entwicklungen zu verwenden.
Und selbst für die Verwendung von Legacy-Code java.io.File
gibt Oracle Hinweise zur Verwendung Path
.
Möglicherweise haben Sie Legacy-Code, der java.io.File verwendet, und möchten die Funktionalität von java.nio.file.Path mit minimalen Auswirkungen auf Ihren Code nutzen.
Die Klasse java.io.File stellt die toPath-Methode bereit, mit der eine Dateiinstanz im alten Stil wie folgt in eine java.nio.file.Path-Instanz konvertiert wird:
Path input = file.toPath();
Sie können dann die umfangreichen Funktionen der Path-Klasse nutzen.
Angenommen, Sie hatten Code, mit dem eine Datei gelöscht wurde:
file.delete();
Sie können diesen Code wie folgt ändern, um die Files.delete-Methode zu verwenden:
Path fp = file.toPath();
Files.delete(fp);