Pfadschnittstelle
1. Path repräsentiert eine Abfolge von Verzeichnisnamen, gefolgt von einem Dateinamen. Wenn die erste Komponente im Pfad die Stammkomponente ist, handelt es sich um den absoluten Pfad, wie z.
2. Der Pfad, der mit der Wurzelkomponente beginnt, ist ein absoluter Weg, sonst ist er ein relativer Weg;
3. Die statische Pfade.get-Methode akzeptiert einen oder mehrere Zeichenfolgen, und die Zeichenfolgen werden automatisch durch den Pfadabscheider des Standarddateisystems verbunden (UNIX IS /, Windows IS /), das das plattformübergreifende Problem löst. Analysieren Sie dann die verbundenen Ergebnisse. Wenn es sich nicht um einen legalen Weg handelt, wird eine Invalidpatexception -Ausnahme ausgelöst, andernfalls wird ein Pfadobjekt zurückgegeben.
// Angenommen, es ist der UNIX -Dateisystem -Pfad absolute = paths.get ("/home", "cat"); // Absolute Pfad Pfad relativ = pahts.get ("ixenos", "config", "user.Properties"); // relativer Weg4. Holen Sie sich das Pfadobjekt aus dem String -Pfad
GET kann auch einen ganzen Pfad erhalten (d. H. Eine einzelne Zeichenfolge, die aus mehreren Komponenten besteht), lesen Sie beispielsweise den Pfad aus einer Konfigurationsdatei:
String -basiert -basiert. // kann erhalten werden/opt/ixenos oder c:/Programmdateien/ixenos path basepath = paths.get (basiert);
5. Kombination oder Parsingwege
1) Wenn Sie P.Resolve (q) aufrufen
Path -WorkRelative = paths.get ("Arbeit"); Path WorkPath = Basepath.Resolve (WorkRelative); // Auflösung kann auch String -Parameter Pfad path path = basepath.resolve ("Arbeit") akzeptieren;2) Aufrufen von P.Resolvesibling ("Q") löst den übergeordneten Pfad O des angegebenen Pfades P und erzeugt den Geschwisterpfad o/q
Pfad temppath = worfpath.resolvesibling ("temp"); / * Wenn Workpath/opt/ixenos/Arbeit ist, dann werden/opt/ixenos/temp erstellt */3) Aufruf von P.Relativize (R) erzeugt einen redundanten Pfad q. Das Parsen Q erzeugt einen relativen Weg r. Am Ende enthält R nicht den Schnittpfad mit P.
/* patha is/home/Misty pathb is/home/ixenos/config Now PATHA hat relativiert pathb, das einen redundanten Pfad erzeugt // zu diesem Zeitpunkt ist PATHC ../ixenos/config/* Normalize -Methode entfernen den redundanten Teil*/pathdd = pathc.normalize (); // pathd ist/ixenos/config
4) Toabsolutepath erzeugt den absoluten Pfad des gegebenen Pfades, beginnend mit der Wurzelkomponente
5) Die Pfadklasse hat auch einige nützliche Methoden, um Pfade zu trennen und zu kombinieren, z.
6) Pfad hat eine Tofile -Methode, um mit Legacy -Dateiklassen umzugehen, und die Dateiklasse hat auch eine Topath -Methode
Dateien Toolklasse
1. Lesen und Schreiben von Dateien
Methodensignatur:
statischer Pfad schreiben (Pfad Pfad, Byte [] Bytes, OpenOption ... Optionen)
statischer Pfad Schreiben (Pfad, iterable <? Erweitert charsequence> Linien, OpenOption ... Optionen)
Hier sind nur die unten verwendeten Methoden. Weitere Methoden finden Sie in der API -Dokumentation ...
Unter ihnen ist OpenOption eine NIO -Schnittstelle, Standardopenoption ist seine Aufzählungsimplementierungsklasse. Bitte überprüfen Sie die API -Dokumentation für jede Aufzählungsinstanzfunktion.
/* Die von Dateien bereitgestellte einfache Methode eignet sich für die Verarbeitung von Textdateien mit mittlerer Länge. Wenn die zu verarbeitende Datei groß oder binär ist, sollten Sie immer noch den klassischen IO -Stream*/// alle Inhalte der Datei in das Byte -Array -Byte [] bytes = files.readallBytes (Pfad) verwenden; // In das Path -Objekt übergeben // Danach können Sie die Zeichenfolge gemäß dem Zeichensatz String content = new String erstellen (Bytes, charSet); // Sie können sie auch direkt als Zeilensequenz in die Liste <string> lines = Dateien = Dateien.ReadallLines (Pfad, charset); // im Gegenteil, Sie können auch eine Zeichenfolge in die Datei schreiben. // BYTE [] // Inhalt anhängen und die Anhängefunktionen wie hinzufügen basierend auf den Parameterdateien ermitteln. // Pause das Aufzählungobjekt und schalten Sie den Anhangschalter ein // Schreiben Sie eine Sammelliste einer Zeilenzeichenfolge in die Dateidateien.write (Pfad, Zeilen).
2. kopieren, schneiden, löschen
Methodensignatur:
Statische Pfadkopie (Pfadquelle, Pfadziel, Kopie ... Optionen)
Statische Pfadbewegung (Pfadquelle, Pfadziel, Kopie ... Optionen)
Statische Leere löschen (Pfad Pfad) // Wenn der Pfad nicht vorhanden ist, wird eine Ausnahme geworfen. Es ist besser, zu diesem Zeitpunkt die folgenden anzurufen
statischer Boolesche Deleteifexisten (Pfad)
Hier sind nur die unten verwendeten Methoden. Weitere Methoden finden Sie in der API -Dokumentation ...
Unter ihnen ist die Kopie eine NIO -Schnittstelle, StandardCopyOption ist seine Aufzählungsimplementierungsklasse. Bitte überprüfen Sie die API -Dokumentation für jede Aufzählungsinstanzfunktion.
Es gibt einen Atomic_Move, der ausgefüllt werden kann, um die Atomoperationen zu gewährleisten, entweder wird die Bewegung erfolgreich abgeschlossen oder die Quelldatei wird in ihrer ursprünglichen Position gehalten.
// Dateien kopieren.copy (von Path, Topath); // Dateien ausschneiden.move (von path, topath);/* Wenn Topath bereits existiert, schlägt der Vorgang fehl. Wenn Sie überschreiben möchten, müssen Sie den Parameter ersetzen. Kopieren Sie auch die Dateiattribute und geben Sie in Copy_attributes*/files.copy (von Path, Topath, StandardCopyOption.Replace_EXISTING, StandardCopyOption.copy_attributes) übergeben.
3. Erstellen Sie Dateien und Verzeichnisse
// Erstellen Sie ein neues Verzeichnis, mit Ausnahme der letzten Komponente müssen die anderen die vorhandenen Dateien sein. Createdirectory (Pfad). // Erstellen Sie das Zwischenverzeichnis im Pfad, mit dem die nicht existierenden Zwischenkomponentendateien erstellt werden können. Wenn es bereits vorhanden ist, wird eine Ausnahme geworfen, um die Existenz der Datei zu überprüfen. Daher kann der Vorgang der Dateierstellung nicht im Prozess*/files.CreateFile (Pfad) durchgeführt werden; // Fügen Sie das Pre-/Suffix hinzu, um eine temporäre Datei oder einen temporären Verzeichnispfad zu erstellen.
4. Erhalten Sie Dateiinformationen
Unterlassen Sie sich die API -Dokumentation für Details oder Corejava Seite 51
5. Iterieren Sie über Dateien im Verzeichnis
Die alte Dateiklasse verfügt über zwei Methoden, um ein String -Array zu erhalten, das aus allen Dateien im Verzeichnis, String [] list () und String [] -Liste (Filterfilter) zusammengestellt wird. Wenn das Verzeichnis jedoch eine große Anzahl von Dateien enthält, ist die Leistung dieser beiden Methoden sehr niedrig.
Ursache Analyse:
1. // Dateiklassenliste Alle Dateien public String [] list () {SecurityManager Security = System.getSecurityManager (); // Dateisystemberechtigungen erhalten, wenn (Sicherheit! = Null) {Security.CheckRead (Path); } if (issinvalid ()) {return null; } return fs.list (this); // Der zugrunde liegende Anruf in die Liste des Dateisystems} // Die Liste der Dateisystem -Abstract -Klasse // Die Dateisystemberechtigungen definieren, wenn (Sicherheit! } if (issinvalid ()) {return null; } return fs.list (this); // Der zugrunde liegende Anruf in die Liste des Dateisystems} // Die Liste der Dateisystem -Abstract -Klasse // Die Dateiklasse definiert FS ein privates statisches endgültiges Dateisystem, das statisch standardmäßig generiert wird. DefaultFilesystem { /*** Gibt das Dateisystem -Objekt für Windows -Plattform zurück. */ public statisches Dateisystem getFilesystem () {return New WinNTFilesystem (); }} // Die winntFilesystem -Klasse erbt aus der Dateisystem abstrakte Klasse. Hier beobachten wir hauptsächlich die Liste der Liste (Dateidatei) @OverridePublic Native String [] Liste (Datei f);/*Wir können sehen, dass dies eine native Methode ist, die zeigt, dass der Betrieb der Liste vom Dateisystem des Betriebssystems gesteuert wird. Wenn das Verzeichnis eine große Anzahl von Dateien enthält, ist die Leistung dieser Methode sehr niedrig. Um es zu ersetzen, entworfene NIO -Klasse -Klasse NewDirectoryStream (Path Dir) und seine überladene Methode, mit der ein iterables Objekt generiert werden kann (kann für die Wege iteriert werden). // List alle 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]) {// rufen Sie die Akzeptanzmethode von DateinameFileter -Objekt v.Add (Namen [i]); }} return v.toArray (neuer String [v.size ()]); }Zu diesem Zeitpunkt kommt die Hochtechnologie - Dateien erhalten iterable Verzeichnisströme,
Geben Sie in einem Verzeichnispfad das Verzeichnis des Nachkommens und geben Sie einen Verzeichnispfadstrom zurück. Beachten Sie, dass alle hier beteiligten Pfade eher Verzeichnisse als Dateien sind!
Daher entwirft die Dateiklasse NewDirectoryStream (Path DIR) und ihre überladene Methode, die ein iterables Objekt erzeugen (kann verwendet werden, um ITEERT zu iteraten).
Iterieren Sie durch das Verzeichnis, um eine iterable Sammlung von Nachkommensdateien zu erhalten
staticDirectoryStream<Path> | newDirectoryStream(Path dir) eröffnet ein Verzeichnis und gibt einen DirectoryStream zurück, um alle Einträge im Verzeichnis zu iterieren. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) öffnet ein Verzeichnis und gibt einen DirectoryStream zurück, um die Einträge im Verzeichnis zu iterieren. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, String glob) |
Die Rückgabe eines Verzeichnisstroms kann als Sammlung angesehen werden, die alle Pfade speichert, die iterable implementiert werden.
Daher iteratoren oder foreach iteriert, aber bei der Verwendung von Iteratoren achten Sie darauf, keinen anderen Iterator aufzurufen:
Während DirectoryStream iterable erstreckt, ist es kein allgemeiner purpose-iterierbar, da es nur einen einzelnen Iterator unterstützt. Das Aufrufen der Iterator -Methode, um eine zweite oder nachfolgende Iterator zu erhalten, wirft IllegaleSexception aus.
Beispiel:
try (DirectoryStream <Path> Einträge = Dateien.NewDirectoryStream (dir)) {für (Pfadeintrag: Einträge) {...}}Sie können Glob -Parameter übergeben, dh den Glob -Modus verwenden, um Dateien zu filtern (anstelle von List (FileFilter -Filter)):
NewDirectoryStream (Path Dir, String Glob) Beachten Sie, dass es sich um den String -Typ handelt
try (DirectoryStream <Path> Einträge = Dateien.NewDirectoryStream (Dir, "*.java")) // {...}Glob -Modus
Das sogenannte Glob-Muster bezieht sich auf den vereinfachten regulären Ausdruck, der von der Schale verwendet wird.
1. Asterisk* übereinstimmt 0 oder mehr Zeichen in der Pfadkomponente; Zum Beispiel *.java übereinstimmt allen Java -Dateien im aktuellen Verzeichnis
2. Zwei Sternchen ** übereinstimmen 0 oder mehr Zeichen über Verzeichnisgrenzen hinweg; Zum Beispiel entspricht Java Java -Dateien in allen Unterverzeichnissen
3. Das Fragezeichen (?) Entspricht nur einem Charakter; Zum Beispiel entspricht Java alle vier Zeichen von Java -Dateien, ausgenommen Erweiterungen; verwenden ? Weil * ein Wildcard -Charakter ist und die Nummer nicht angibt
4. [...] Um einem Zeichensatz zu entsprechen, können Sie die Verbindung [0-9] und das inverse Zeichen [! 0-9] verwenden; Zum Beispiel wird Test [0-9A-F] .Java mit testx.java übereinstimmen, vorausgesetzt, X ist eine hexadezimale Nummer, [0-9a-f], um einen einzelnen Charakter als hexadezimale Zahl wie B zu entsprechen (hexadezimal ist Fallinsensitiv)
Wenn Sie Dash in quadratischen Klammern verwenden, um zwei Zeichen zu trennen, bedeutet dies, dass alle im Bereich dieser beiden Zeichen übereinstimmen können (z. B. [0-9] bedeutet, dass alle 0 bis 9 Zahlen übereinstimmen).
5. {...} übereinstimmen mit einer der von Commas getrennten optionalen Optionen; Zum Beispiel *. {Java, Klasse} Stimmen Sie mit allen Java -Dateien und Klassendateien überein
6./ entkommen Zeichen in einem der oben genannten Muster; Zum Beispiel übereinstimmt */** Dateien mit Dateinamen in allen Unterverzeichnissen mit *, hier ist ** Escape, deren Übereinstimmung mit 0 oder mehr Zeichen vorangegangen ist
Das Folgende ist das von den Internetnutzern zusammengefasste Glob -Modell:
| Glob -Modus | beschreiben |
|---|---|
| *.txt | Passen Sie alle Dateien mit der Erweiterung .txt an |
| *. {html, htm} | Passen Sie alle Dateien mit Erweiterungen von .html oder .htm an. {} wird für den Gruppenmodus verwendet, der durch Kommas getrennt wird |
| ?.txt | Stimmen Sie ein einzelnes Zeichen als Dateiname und Erweiterung an .txt |
| . | Passen Sie alle Dateien mit Erweiterungen an |
| C:/Benutzer/* | Passen Sie alle Dateien im Benutzerverzeichnis des C -Laufwerks an. Backslash "/" wird verwendet, um den unmittelbaren folgenden Zeichen zu entkommen |
| /heim/** | Passen Sie alle Verzeichnisse und Home -Verzeichnisse und -dateien unter Subdirektorien auf der UNIX -Plattform an. ** Früher übereinstimmte das aktuelle Verzeichnis und alle seine Unterverzeichnisse |
| [xyz] .txt | Passen Sie alle einzelnen Zeichen als Dateinamen an, und ein einzelnes Zeichen enthält nur eines von "x" oder "y" oder "z" und hat eine Erweiterung von .txt. Quadratklammern [] werden verwendet, um eine Sammlung anzugeben |
| [ac] .txt | Passen Sie alle einzelnen Zeichen als Dateinamen an, und ein einzelnes Zeichen enthält nur eine der drei Arten von "A" oder "B" oder "C" und hat eine Erweiterung von .txt. Das Minuszeichen "-" wird verwendet, um einen Bereich anzugeben und kann nur in quadratischen Klammern verwendet werden [] |
| [! A] .txt | Stimmen Sie alle einzelnen Zeichen als Dateinamen an, und ein einzelnes Zeichen kann den Buchstaben "A" nicht enthalten und die Erweiterung ist .txt. Ausrufezeichen "!" wird verwendet, um zu negieren |
Ist es nicht gut, alle Sammlungen von Nachkommensakten in einem bestimmten Verzeichnis zu iterieren? Kommen Sie, lassen Sie uns alle Nachkommen (einschließlich Verzeichnisse und Dateien) eines Verzeichnisses direkt durchqueren.
Wir können die WalkFiletree -Methode der Dateienklasse aufrufen und ein Objekt des Dateivisor -Schnittstellentyps übergeben (es gibt mehr Methoden, die Sie in der API entdecken können ...)
/*Übergeben Sie ein anonymer Objekt der Dateivisor -Unterklasse*/files.walkFiletree (Dir, New SimpleFilevisor <Path> () {// Walkfiletree Callback Diese Methode wird verwendet, um alle Descedants Public FileviStresult -Besuchsfile (BasicFileTtribuse Attributes) zu durchqueren. Code, der nichts mit dem Zweck von WalkFiletree zu tun hat (PATH).Lassen Sie es uns zusammenfassen,
Dateien.NewDirectoryStream (Path Dir) gibt eine iterable Sammlung von Nachkommensdateien nach dem Traversal zurück;
Dateien.WalkFiletree (Path Dir, Filevisor FV) ist ein Prozess, in dem die Verzeichnisse und Dateien von Nachkommen durchlaufen werden.
ZIP -Dateisystem
Wie wir oben wissen, sucht die Paths -Klasse im Standarddateisystem nach Pfaden, dh Dateien auf der lokalen Festplatte des Benutzers.
Tatsächlich können wir auch andere Dateisysteme wie ZIP -Dateisysteme haben.
/*Angenommen, ZipName ist der Name einer ZIP -Datei*/Dateisystem fs = filesystem.newFilesystem (paths.get (ZipName), null);
Der obige Code erstellt ein zipname-basiertes Dateisystem, das alle Dateien im ZIP-Dokument enthält.
1) Wenn Sie den Dateinamen (Zeichenfolge -Typ) kennen, ist es einfach, die Datei aus diesem ZIP -Dokument zu kopieren:
Dateien.Copy (fs.getPath (Dateiname), TargetPath);
F: FS.GetPath verwendet das ZIP -Dateisystem, um Pad zu erhalten. Kann das Standarddateisystem aufgerufen werden?
A: Ja. In der Dateisystemklasse gibt es eine statische Methode von getDefault (), die ein Standard -Dateisystemobjekt zurückgibt, das auch mit dem Dateinamen getPath erhalten werden kann.
Für bestimmte Zwecke, ob GetPath (String -Name) durchquert oder zufälliger Zugriff ist, finden Sie in der Implementierung der Quellcode, wenn Sie Zeit haben.
2) Um alle Dateien im ZIP -Dokument aufzulisten, können Sie auch Walkfiletree verwenden, um die Dateibaum zu durchqueren
FileSystem fs = FileSystems.newFileSystem(Paths.get(fileName), null);//walkFileTree needs to pass in a directory Path to be traversed, and a FileVisitor object Files.walkFileTree(fs.getPath("/"), newSimpleFileVisitor<Path>(){ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) löscht Ausnahme {System.out.println (Datei);Das obige Beispiel für die Zusammenarbeit von Java Nio Path -Schnittstelle und -dateien ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.