Vorwort
Ab diesem Artikel werden wir das Java IO -System lernen, das im Wesentlichen Dateien liest und schreibt. Es klingt einfach, aber es ist nicht einfach. Das IO -System von Java hat sich verbessert und verbessert und eine große Anzahl von Klassen entworfen. Nur durch das Verständnis der Bedeutung dieser Typen und deren jeweiligen Anwendungsszenarien können wir das Verständnis von Datei -IO verbessern.
Der erste Schritt besteht also darin, das Problem zu lösen, wie eine Datei dargestellt wird. In der Java -Welt ist "alles ein Objekt" und wie man einer tatsächlichen Festplattendatei oder einem Verzeichnis eines Java -Objekts entspricht, ist unser Hauptproblem.
Die Datei wird in Java verwendet, um eine Datei abstrahieren, unabhängig davon, ob es sich um eine normale Datei oder ein Verzeichnis handelt. Sie kann einem Dateiobjekt entsprechen. Ich denke, jeder muss bei der Positionierung des Dateityps genau sein: Es stellt einfach eine Datei oder ein Verzeichnis auf der Festplatte ab und stützt sich tatsächlich auf eine plattformunabhängige lokale Dateisystemklasse, und die Datei kann keine Lese- und Schreibvorgänge auf dem von ihm dargestellten Dateiinhalt ausführen (das ist, was Stream tut).
Erstellen Sie eine Dateiinstanz
Bevor wir die Methode für die Dateiinstanzkonstruktor tatsächlich vorstellen, müssen wir uns die verschiedenen wichtigen Attributmitglieder ansehen.
private statische endgültige Dateisystem fs = defaultFilesystem.getFilesystem ();
Dies ist das zentralste Mitglied der Dateiklasse, das als Dateisystem -API des aktuellen Systems dargestellt wird. Alle an die Festplatte ausgegebenen Operationen basieren auf dieser Immobilie.
privater endgültiger Stringweg;
Pfad repräsentiert den vollständigen Pfadnamen der aktuellen Instanz. Wenn die aktuelle Dateiinstanz ein Verzeichnis darstellt, ist der Wert des Pfades der vollständige Verzeichnisname. Wenn es eine reine Datei darstellt, ist der Wert dieses Pfads gleich dem vollständigen Pfad der Datei + dem Dateinamen.
public static Final char separatorchar = fs.getSesparator (); öffentliches statisches endgültiges char pathsparatorchar = fs.getPathseparator ();
Der SeparatorChar repräsentiert das Separator zwischen Verzeichnissen und PathsaratorChar repräsentiert das Separator unter verschiedenen Pfaden. Diese beiden Werte unterscheiden sich unter verschiedenen Systemplattformen. Beispielsweise sind die Werte dieser beiden unter Windows: "" und ";;", wobei das Verbot verwendet wird, um mehrere verschiedene Pfade zu trennen.
Die Dateiklasse enthält vier verschiedene Konstruktoren zum Instanziieren eines Dateiobjekts, aber nur drei werden häufiger verwendet. Wir konzentrieren uns auch darauf, die ersten drei Konstruktoren zu lernen.
öffentliche Datei (String PathName)
Dies ist die häufigste Möglichkeit, ein Dateiobjekt zu instanziieren. Der Wert von Pathname kann ein Verzeichnis oder ein einfacher Dateiname sein. Zum Beispiel:
File file = new File ("c: // user // yanga // desktop"); Datei Datei1 = new Datei ("c: //users//yanga//desktop//a.txt"); Datei 2 = new Datei ("A.Txt");Natürlich können Sie auch explizit einen übergeordneten Pfad angeben:
Öffentliche Datei (Zeichenfolge übergeordnet, Zeichenfolge Child)
Im Konstruktor spleißt das Programm einen vollständigen Dateipfad für uns, zum Beispiel:
Datei Datei = new Datei ("c: // user // yanga // desktop", "a.txt"); Dateidatei1 = neue Datei ("c: // user // yanga // Desktop", "java");Der dritte Konstruktor ist im Wesentlichen der gleiche wie der zweite, außer dass er einen Kapselungsprozess der übergeordneten Dateiinstanz hinzufügt:
Öffentliche Datei (Datei übergeordnet, Zeichenfolge untergeordnet)
Ähnliche Situationen werden nicht erklärt. Wir haben uns hier nicht mit der internen spezifischen Implementierung dieser Konstrukteure befasst. Es ist nicht so, dass es einfach ist. Stattdessen stützt sich die Datei zu sehr auf das lokale Dateisystem, und die Implementierung vieler Methoden kann nicht direkt gesehen werden. Daher reicht es für das Lernen einer Datei aus, um sie zu beherrschen, und die spezifische Implementierung kann vorerst nicht ausführlich gelernt werden.
Informationen zum Dateinamen oder Pfad erhalten
Die GetName -Methode kann verwendet werden, um den Dateinamen zu erhalten:
public String getName () {int index = path.lastIndexof (separatorchar); if (index <prefixLength) return path.substring (prefixLength); return path.substring (Index + 1);}Erinnerst du dich, was unser Separatorchar repräsentiert?
Es wird als Pfadabscheider dargestellt, das Symbol "" in Windows wird im Pfadattribut und der vollständige Pfadname der aktuellen Dateiinstanz gespeichert, sodass alle Zeichen nach dem letzten Vorkommen unser Dateiname sein müssen.
Natürlich müssen Sie festgestellt haben, dass für reine Dateien diese Methode den einfachen Namen der Datei zurückgeben kann, während für ein Verzeichnis der Rückgabewert der neueste Verzeichnisname ist. Zum Beispiel:
File file = new File ("c: //users//yanga//desktop//a.txt");Die Ausgabe wird Sie nicht überraschen:
A.TXTDESKTOP
Die GetParent -Methode wird verwendet, um das übergeordnete Verzeichnis der aktuellen Datei zurückzugeben. Unabhängig davon, ob Sie eine einfache Datei oder ein Verzeichnis sind, haben Sie irgendwann Ihr übergeordnetes Verzeichnis (natürlich sind temporäre Dateien, die vom virtuellen Computer generiert werden, natürlich nicht).
public String getParent () {int index = path.lastIndexof (separatorchar); if (index <prefixLength) {if (((PräfixLengt)) && (path.length ()> Präfixlength)) return path.substring (0, Präfixlength); null zurückkehren; } return path.substring (0, index);}Die Implementierung der Methode ist sehr einfach, daher werde ich nicht auf Details eingehen.
Die GetPath -Methode kann den vollständigen Dateinamen der aktuellen Dateiinstanz zurückgeben:
public String getPath () {return path;}Im Folgenden sind einige bezogene Operationen im Zusammenhang mit Verzeichnissen im Zusammenhang mit der Implementierung relativ einfach. Hier ist eine kurze Liste:
Hier müssen wir eine Erklärung für GetCanonicalPath erklären, was ist ein Standardweg und gibt es einen Unterschied zwischen einem absoluten Weg?
Im Allgemeinen bedeutet "../" das vorherige Verzeichnis des Verzeichnisses, in dem sich die Quelldatei befindet, "../../" das vorherige Verzeichnis des Verzeichnisses, in dem sich die Quelldatei befindet, und so weiter. Die GetAbSolutepath -Methode führt solche Konvertierungsvorgänge nicht durch, während die GetCanonicalPath -Methode diese Sonderzeichen erkennt und geeignete Semantik annimmt.
Zum Beispiel:
File file = new File ("..// a.txt"); System.out.println (file.getabsolutepath ());Ausgangsergebnis:
C:/user/yanga/desktop/java/workspace2017/testfile /../ a.txt
C: /Users/yanga/desktop/java/workspace2017/a.txt
Ersteres wird "../a.txt" als Teil des Dateipfadnamens verwendet, während der letztere erkennen kann, dass "../a.txt" bedeutet, dass sich "A.Txt" im oberen Verzeichnis des aktuellen Verzeichnisses befindet. Dies ist der größte Unterschied zwischen den beiden, der für verschiedene Situationen geeignet ist.
Holen Sie sich die Attributinformationen der Datei
Der Betrieb dieses Teils der Datei ist eigentlich sehr einfach, es ist nichts weiter als einige Fragen zu Dateiberechtigungen, ob es lesbar ist, ob es sich um schriftlich handelt, ob es sich um eine versteckte Datei usw. handelt. Schauen wir uns diese Methoden im Detail an:
Es ist zu beachten, dass die Längenmethode die Gesamtzahl der Bytes der Datei für eine reine Datei korrekt zurückgeben kann. Für ein Verzeichnis ist der Rückgabewert jedoch ein "nicht spezifizierter" Wert, der weder die Gesamtzahl der Bytes aller Dateien im Verzeichnis noch Null ist, aber nur ein nicht spezifizierter Wert ist, der keine Bedeutung hat.
Dateioperation
Der Betrieb von Dateien ist nichts anderes als "Hinzufügen, Löschen, Änderungen und Suche". Schauen wir uns zusammen.
Natürlich liefert die Dateiklasse beim Umgang mit den beiden oben genannten einfachen neuen Erstellungs- und Löschvorgängen auch die sogenannten "Abfrage" -Operationen, die wir sorgfältig lernen müssen. Zum Beispiel:
public String [] list () {SecurityManager Security = System.GetSecurityManager (); if (Security! = null) {Security.CheckRead (Path); } if (issinvalid ()) {return null; } return fs.list (this);}Diese Methode ruft alle einfachen Namen von "reinen Dateien" und "Verzeichnis" im Verzeichnis ab, das durch die aktuelle Instanz dargestellt wird. Zum Beispiel:
Datei Datei = new Datei ("c: // user // yanga // desktop"); string [] list = file.list (); für (string str: list) {System.out.println (str);}Das Ausgabeergebnis des Programms druckt die einfachen Namen aller Dateien in meinem Computer -Desktop -Verzeichnis, sodass ich es Ihnen nicht anzeigen werde.
Eine Sache, die zu beachten ist, dass unsere Dateiinstanz einem Verzeichnis, sondern einer einfachen Datei nicht entspricht, die Liste null zurückgibt.
Schauen wir uns als nächstes eine Methode zum Abrufen von Verzeichnisdateien an:
public String [] list (DateinameFilter -Filter) {String names [] = list (); if ((names == null) || (filter == null)) {return names; } List <string> v = new ArrayList <> (); für (int i = 0; i <names.length; i ++) {if (filter.accept (this, names [i])) {v.add (Namen [i]); }} return v.toArray (neuer String [v.size ()]);}Diese Methode ist tatsächlich eine überlastete Version der Liste, mit der Sie einen Filter übergeben können, um nur die Dateien und Verzeichnisse zu filtern, die wir beim Durchsuchen von Verzeichnissen benötigen.
Die Definition der DateinameFilter -Schnittstelle ist jedoch so einfach:
public interface DateinameFilter {boolean Accept (Datei dir, String -Name);}Sie müssen diese Akzeptanzmethode nur überschreiben. Jedes Mal, wenn die Liste für Loop eine Datei oder ein Verzeichnis erhält, wird versucht, diese Filtermethode zuerst aufzurufen. Wenn Sie die Filterung übergeben, wird der einfache Name der aktuellen Datei zur Rücksendung hinzugefügt.
Daher bestimmt das Umschreiben dieser Akzeptanzmethode, welche Dateien die Filterung übergeben können und welche nicht. Schauen wir uns ein Beispiel an:
Die Dateien im Testordner auf meinem Desktop sind wie folgt:
Datei Datei = neue Datei ("c: // user // yanga // desktop // test"); String [] list = file.list (neuer DateiNameFilter () {@Override public boolean ACCEPT (Datei DIR, String -Name) {// Das aktuelle Dateiobjekt, das von DIR // Name dargestellt wird // Name ist der einfache Name des Dateielements, der derzeit durchquert wird, wenn (! Name.endswith (". für (string str: list) {system.out.println (str); }Hier verwenden wir eine anonyme innere Klasse, um eine Unterklasseinstanz von DateinameFilter zu erstellen und dann seine Akzeptanzmethode zu implementieren. Die spezifische Implementierung ist sehr einfach, filtert alle Verzeichnisse und entnimmt die einfachen Namen aller Klartext.
Das endgültige Ausgangsergebnis ist wie folgt:
3.txt
4.Txt
Natürlich gibt es auch zwei "mutierte" Listenmethoden in der Dateiklasse, wie z. B.:
Sie geben die einfachen Namen von "reinen Dateien" und "Verzeichnissen" nicht mehr im Zielverzeichnis zurück, sondern das entsprechende Dateiobjekt. Tatsächlich ist es nichts. Das Zielverzeichnis + Ein einfacher Name kann diese Dateiinstanzen erstellen.
Daher durchquert die Listenmethode nicht alle Dateien im Zielverzeichnis, dh auf die Dateien im Unterverzeichnis des Zielverzeichnisses werden nicht zugegriffen und durchquert.
Sie sollten also darüber nachdenken, wie Sie alle Dateien im Zielverzeichnis durchqueren können, einschließlich tiefer Dateien in den Unterverzeichnissen der ersten Ebene. Die Antwort wird am Ende des Artikels gegeben.
Die nächsten beiden Methoden beziehen sich auf die Erstellung von Ordnern:
Beide basieren auf der aktuellen Dateiinstanz, um Ordner zu erstellen. In Bezug auf ihre Unterschiede schauen wir uns zunächst einen Code an:
Datei Datei = neue Datei ("c: // user // yanga // desktop // test2");Unter ihnen existieren Test2 und Test3 erst, wenn das Programm ausgeführt wird.
Das Ausgabeergebnis ist wie folgt:
WAHR
FALSCH
Warum hat letztere nicht geschaffen?
Dies liegt an der Tatsache, dass die MKDIR -Methode jeweils nur einen Ordner erstellen kann, was dazu führt, dass ein Schöpfungsfehler verursacht wird, wenn das übergeordnete oder ein höheres Verzeichnis des gegebenen Verzeichnisses ein ungeschicktes Verzeichnis vorliegt.
Die MKDIRS -Methode wird verwendet, um diese Situation zu lösen. Es wird alle nicht geschaffenen Verzeichnisse auf dem Zielpfad erstellt, siehe Code:
Dateidatei3 = Neue Datei ("c: // user // yanga // desktop // test3 // Hallo // 231"); System.out.println (File3.mkdirs ());Auch wenn unser Test3 -Ordner nicht vorhanden ist, werden nach dem Programm die drei Ordner Test3, Hello und 231 erstellt.
Darüber hinaus verfügt die Datei über eine Methode zum Erstellen von temporären Dateien. Die sogenannten temporären Dateien sind: Sie existieren während der Laufzeit und werden zerstört, wenn die virtuelle Maschine heruntergefahren wird. Sie können es selbst studieren. Es ist relativ einfach zu bedienen, daher werde ich hier nicht auf Details eingehen.
Zu diesem Zeitpunkt haben wir grob etwas über die Dateitypdatei erfahren. Ich glaube, jeder wird mehr oder weniger das Gefühl haben, dass die Gestaltung der Darstellung reiner Dateien und Verzeichnisse mit demselben Typ etwas verwirrend und unangemessen erscheint. Ich weiß, dass JDK1.7 Sun Dateien und Pfad zu trennen Dateien und Verzeichnissen gestartet hat, und wir werden in zukünftigen Artikeln mehr darüber erfahren.
Alle Codes, Bilder und Dateien im Artikel werden in der Cloud auf meinem GitHub gespeichert:
(https://github.com/singleyam/overview_java)
Sie können auch lokal herunterladen.
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.