Java: Pfad gegen Datei

200

Gibt es für neue Anwendungen, die in Java 7 geschrieben wurden, einen Grund mehr, ein java.io.FileObjekt zu verwenden, oder können wir es als veraltet betrachten?

Ich glaube, dass java.nio.file.Pathman alles kann, was man java.io.Filekann und mehr.

Dogbane
quelle

Antworten:

152

Um es kurz zu machen:

java.io.Filewird höchstwahrscheinlich nie veraltet / nicht unterstützt. Das heißt, java.nio.file.Pathist Teil der moderneren java.nio.fileBibliothek und tut alles java.io.File, aber im Allgemeinen besser und mehr.

Verwenden Sie für neue Projekte Path.

Und wenn Sie jemals ein FileObjekt für Legacy benötigen , rufen Sie einfach Path # toFile () auf.

Migration von Datei zu Pfad

Diese Oracle-Seite hebt Unterschiede hervor und ordnet sie java.io.File functionalityzujava.nio.file lib (including Path) functionality

Artikel von Janice J. Heiss und Sharon Zakhour, Mai 2009, über das NIO.2-Dateisystem in JDK 7

Don Cheadle
quelle
12
Sie können die Kommentare von Oracle zu den Unterschieden hier lesen: docs.oracle.com/javase/tutorial/essential/io/legacy.html
Josiah Yoder
4
Beachten Sie auch, dass "Dateien" (im Plural) nicht veraltet sind. Es ist im Wesentlichen eine abstrakte Klasse, die mit Pfadobjekten arbeitet und viele der Funktionen der alten File-Klasse ausführt, wie z. B. isDirectory () oder exist ()
Josiah Yoder
2
Jetzt frage ich mich: Warum werden die neuen File / FolderChooser-Dialoge in JavaFX 8 dann immer noch Fileanstelle von verwendet Path?
Piegames
2
Pfad ist eine Schnittstelle. Verwenden Sie zum Erstellen einer Instanz Paths.get (Dateiname). Es könnte an der Verwirrung liegen, dass Files.exists (Paths.get (Dateiname)) anstelle von new File (Dateiname) .exists () geschrieben werden muss, dass die ältere API weiterhin verwendet wird.
Josiah Yoder
Pathkann einfacher geändert werden, um "Kinder hinzuzufügen" mit resolve(...)oder "eine Ebene nach oben zu bewegen" getParent()usw., wohingegen Filedies nicht möglich ist. Wenn Sie den Pfad nach Abschluss geändert haben, konvertieren Sie toFile()ihn häufig, damit er in ältere Methoden wie einen FileInputStreamKonstruktor gesendet werden kann .
MasterHD
18

können wir es als veraltet betrachten?

Nein, Sie können es nicht als veraltet betrachten, es sei denn und bis es im FileJavadoc so markiert ist .

Marquis von Lorne
quelle
14
Selbst wenn dies eine dieser "Weil der RFC es sagt" -Antworten ist, würde ich es nicht als eine gute Antwort betrachten. Es ist ziemlich offensichtlich, dass die Datei durch den Pfad ersetzt wird. Wenn Sie der Zeit voraus sein möchten, können Sie Path sofort verwenden und bei Bedarf toFile () verwenden.
Chris
15
@Chris Seit der Änderung des AWT-Ereignismodells in 1.02 wurde noch nie etwas aus dem JDK entfernt. Es ist überhaupt nicht "offensichtlich". Es ist falsch.
Marquis von Lorne
5
@downvoters Diese Antwort ist im Wesentlichen eine Tautologie. Es kann nicht falsch sein. NB In den fünf Jahren, seit ich diese Antwort geschrieben habe, ist Java 8 später erschienen und java.io.Filewird weder entfernt noch veraltet, und es gibt immer noch nichts im Javadoc, was darauf hindeutet, dass eines dieser Dinge jemals passieren wird.
Marquis von Lorne
2
@EJP Ich habe gerade Ihren Kommentar positiv bewertet. Ich bin mir jedoch nicht ganz sicher, ob Sie Recht haben, wenn Sie sagen, dass die Antwort eine Tautologie ist. Die Frage, die wahrscheinlich als "meinungsbasiert" hätte gequetscht werden müssen, lautet: "Können wir sie als veraltet betrachten ?". Nun ja, das OP und jeder andere kann , aber es ist nicht so.
Mike Nagetier
@mikerodent Ich schlage vor, das ist nur eine vorsätzliche Fehlinterpretation dessen, worum es bei der Frage wirklich geht. Auch ein Teilzitat.
Marquis von Lorne
8

Weitere Informationen finden Sie in diesem Artikel unter http://www.oracle.com/technetwork/articles/javase/nio-139333.html

Grundsätzlich wird file.Path von nun an der richtige Weg sein, aber wie allgemein bekannt ist, neigen Java-Leute dazu, die Rückkompatibilität beizubehalten. Ich denke, deshalb haben sie es verlassen.

LordDoskias
quelle
Würden Sie bitte den Link aktualisieren? Ich möchte diesen Artikel lesen.
John B
Leider konnte ich den Originalartikel nicht auf der Orakel-Webseite finden. Hier ist eine Version von der Wayback-Maschine: web.archive.org/web/20090601091119/http://java.sun.com/…
LordDoskias
1
Ich fand den Artikel wieder auf einer normalen Oracle-Seite - Link zur Antwort hinzugefügt.
Duncan Jones
5

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 deprecatedMitteln, 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 @EJPist 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.Fileoder java.nio.file.Pathfür neue Entwicklungen, und wenn die Antwort lautet java.nio.file.Path, könnten Sie sie java.io.Filefü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.FileKlasse 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.Filebrauchen wir wirklich keinen Grund, diese Klasse für neue Entwicklungen zu verwenden.
Und selbst für die Verwendung von Legacy-Code java.io.Filegibt 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);
davidxxx
quelle
Kurz gesagt, sie / er kann es tatsächlich als veraltet betrachten, wenn sie / er möchte.
Mike Nagetier
@ Mike Nagetier. Genau. Konzeptionell sollte sie / er, obwohl dies in Bezug auf Javadoc aus erklärten Gründen nicht der Fall ist.
Davidxxx
4

Ja, aber viele vorhandene APIs, einschließlich der Java7-eigenen Standard-APIs, funktionieren immer noch nur mit FileTyp.

unwiderlegbar
quelle
8
Pfadobjekte können mit Path.toFile () in Dateiobjekte konvertiert und anschließend Standard-APIs verwendet werden.
Jacktrades
2
Ihre Antwort lautet also "Ja, aber nein"?
Marquis von Lorne
1

Java.io.File ist nicht veraltet. Ja, java.nio.file.Path ist besser, aber solange es noch viele Programme und Lehrbücher gibt, die Java.io.File verwenden, sollte es nicht als veraltet angesehen werden, es ist zu wichtig. Dies würde nur bedeuten, einen Schraubenschlüssel in die Werke zu werfen, um nicht den ganzen Gewinn zu erzielen. Zum Beispiel verwendet das Android-Framework Datei für einige seiner grundlegenden Funktionen zur Dateiverwaltung, viele andere Dinge tun dies.

Andrew S.
quelle
Er fragte nicht, ob Pathes besser sei. Er fragte, ob Fileveraltet sei.
Marquis von Lorne
1
@EJP Ich denke du bist ein bisschen über pedantisch. Das OP hat gefragt, ob java.io.File veraltet ist, und ich habe darauf geantwortet. Er sagte auch: "Ich glaube, ein java.nio.file.Path kann alles, was ein java.io.File kann und mehr." Ich habe lediglich seinen Kommentar bestätigt, es war kaum eine Abstimmung wert.
Andrew S
-9

Gibt es für neue Anwendungen, die in Java 7 geschrieben wurden, einen Grund mehr, ein java.io.File-Objekt zu verwenden, oder können wir es als veraltet betrachten?

Das ist ein bisschen wie zu sagen: "Sollte Napoleon in Russland einmarschieren, oder sind diese Rosenkohl wirklich lecker?"

Der zweite Teil der Frage kann in der Tat als veraltet angesehen werden. Ab Januar 2018 ist es nicht veraltet. Aber nichts hindert Sie daran , es so zu betrachten. Ob das Ihnen in diesem oder im nächsten Leben einen Vorteil verschafft, kann man nicht sagen.

Mike Nagetier
quelle
5
Ich verstehe deine Analogie nicht.
Tunaki
Jede "oder" Frage sollte zwei logische Alternativen darstellen, die beide im Wesentlichen dieselbe Frage beantworten.
Mike Nagetier
Entschuldigung, das klingt in diesem Zusammenhang sehr pedantisch. Die Idee ist "Ich möchte verwenden File. Soll ich, ja oder nein?"
Tunaki
1
Ja, ich stimme zu, es ist eine geladene Frage ... zumal viele vorhandene APIs von Drittanbietern Filesowieso noch verwendet werden. Es wird nicht so schnell sterben.
Tunaki
3
it isn't deprecated. But there's nothing to stop you *considering* it soLOL.
Don Cheadle