Die Eingangs- und Ausgangsfunktionen der Java -Sprache sind sehr leistungsfähig und flexibel. Der einzige Nachteil ist, dass die Eingangs- und Ausgangscodes sehr präzise zu sein scheinen, da Sie häufig viele verschiedene Objekte einwickeln müssen. In der Java -Klassenbibliothek ist der Inhalt des IO -Teils sehr groß, da es sich um einen breiten Bereich von Feldern handelt: Standardeingabe und Ausgabe, Dateibetrieb, Datenströme im Netzwerk, String -Streams, Objektströme, Zip -Datei -Streams ... Der Zweck dieses Artikels ist die Einführung einer detaillierten Erläuterung von Eingabebestellen und Ausgabe -Stream -Beispielen in Java.
Die Hierarchie der Flüsse
Definition:
Java wird das Datenobjekt in einem Eingabestream lesen, und das Objekt, an das es geschrieben werden kann, wird als Ausgabestream bezeichnet. Das Strukturdiagramm lautet wie folgt:
1. Eingang und Ausgang:
Eingabe/Ausgabe bezieht sich auf die Eingabe oder Ausgabe von Daten in ein bestimmtes Gerät oder eine bestimmte Umgebung. Jede Sprache hat die Funktion von Eingabe und Ausgabe. In einem Java -Programm werden Eingabe und Ausgabe durch Streams abgeschlossen. Es ist über ein Java -Eingangs- und Ausgangssystem mit physischen Geräten verbunden. Obwohl die tatsächlichen physikalischen Geräte, die mit den Eingangs- und Ausgangsströmen verbunden sind, unterschiedlich sind, können sie auf die gleiche Weise funktionieren. Zum Beispiel für die Eingabe und Ausgabe der Festplatte, die Eingabe und Ausgabe des Netzwerkhosts, werden verschiedene Eingangs- und Ausgangsprobleme und -lösungen für verschiedene Geräte oder Umgebungen vorliegen.
2. Stream:
Ein Stream bezieht sich auf eine Folge von Daten, die zwischen Eingabe und Ausgabe eines Computers bewegt werden. Die Daten in der Stream -Sequenz können entweder rohe Binärdaten sein, die nicht verarbeitet wurden, oder bestimmte Daten, die den Anforderungen eines bestimmten Formats nach einem bestimmten Codierungsprozess entsprechen. Es ist üblich, den Teil des Codes Internal und den Teil unabhängig vom Code extern zu bezeichnen.
Aus der Datenübertragungsmethode kann der Stream in Eingabestream und Ausgangsstrom unterteilt werden. Aus dem Inhalt des Streams kann der Stream in Byte -Stream- und Zeichenstrom unterteilt werden.
(1) Eingangs- und Ausgangsstrom
Die Funktion des Eingabestreams besteht darin, Daten aus dem Inneren des Programms nach außen zu lesen.
Die Funktion des Ausgabestreams besteht darin, Daten von außerhalb des Programms auf im Inneren zu schreiben.
(2) Byte -Stream und Zeichenstrom
Ein Byte -Stream kann Daten in Einheiten von Bytes lesen und schreiben, die Daten von einem Byte nach dem anderen lesen und schreiben können, oder Byteblöcke jeder Länge gleichzeitig (d. H. Byte -Arrays).
Charakterströme werden in Zeichen verwendet, wenn Daten in Streams gelesen und geschrieben werden, jeweils ein Zeichen oder einen Charakterblock gleichzeitig.
Um die Stream -Verarbeitung zu erleichtern, werden Streams in der Java -Sprache im Java.io -Paket verkapselt. Um Streams zu verwenden, müssen Sie das Java.io -Paket importieren.
Der E/A -Stream von Java basiert auf vier abstrakten Klassen, nämlich InputStream, OutputStream, Leser und Schriftsteller. Die InputStream -Klasse und ihre Unterklasse können verwendet werden, um die Eingabeverarbeitung von Byte -Stream -Daten zu implementieren. Die OutputStream -Klasse und ihre Unterklasse können verwendet werden, um die Ausgangsverarbeitung von Byte -Stream -Daten zu implementieren. Die Leserklasse und ihre Unterklasse können verwendet werden, um die Eingabeverarbeitung von Zeichenstromdaten zu implementieren. Die Autor -Klasse und ihre Unterklasse können verwendet werden, um die Ausgangsverarbeitung von Zeichenstromdaten zu implementieren.
1. Dateiklasse
Das Lesen und Schreiben von Dateien in Java kann über Eingabe- und Ausgabestreams implementiert werden. Java bietet jedoch eine spezielle Dateiklasse, um sie für Dateiverzeichnisse, Eigenschaften und Verwaltungsinformationen zu implementieren.
(1) Der Konstruktor der Dateiklasse
Die Konstruktoren zum Erstellen eines Dateiklassenobjekts sind:
Datei (String PathName); // Basierend auf dem Pfadnamen erstellen.
Datei (Datei übergeordnet, Zeichenfolge unterzeichnet); // Erstellen Sie unter dem angegebenen Dateiobjekt.
Datei (Zeichenfolge übergeordnet, Zeichenfolge untergeordnet); // basierend auf dem angegebenen Pfad erstellen.
Datei (URL URL); // Basierend auf einem URL -Link erstellen.
(2) Häufige Methoden der Dateiklasse
boolean canread (): Bestimmt, ob der dem Dateiobjekt entsprechende Pfad lesbar ist.
Boolean canwrite (): Bestimmt, ob der dem Dateiobjekt entsprechende Pfad beschreibbar ist.
Boolesche existiert (): Bestimmt, ob der Pfad, der dem Dateiobjekt entspricht, vorhanden ist.
String getABSolutepath (): Erhält den absoluten Pfad des entsprechenden Pfades des Dateiobjekts.
String getParent (): Erhält das Verzeichnis des entsprechenden Pfades des Dateiobjekts.
String getPath (): Holt den Pfad, der dem Dateiobjekt entspricht.
boolean isabsolute (): Bestimmt, ob der dem Dateiobjekt entsprechende Pfad ein absoluter Pfad ist.
String getName (): Ruft den Dateinamen des entsprechenden Pfades des Dateiobjekts ab.
boolean isdirectory (): Bestimmt, ob der dem Dateiobjekt entsprechende Pfad ein Verzeichnis ist.
boolean isFile (): Bestimmt, ob der Pfad, der dem Dateiobjekt entspricht, eine Datei ist.
boolean ishidden (): Bestimmt, ob die dem Dateiobjekt entsprechende Datei ein verstecktes Attribut ist.
Langlänge (): Erhalten Sie die Länge der Datei, die dem Dateiobjekt entspricht.
Long lastModified (): Erhalten Sie die neueste Änderungszeit der Datei, die dem Dateiobjekt entspricht.
Boolean Renameto (Dateidest): Ändern Sie den Dateinamen der Datei, die dem Dateiobjekt entspricht.
boolean setReadonly (): Setzen Sie die entsprechende Datei des Dateiobjekts auf schreibgeschützte.
(3) Erstellen einer Datei
Erstellen Sie eine neue Datei, indem Sie einen Dateiausgabestream erstellen. Diese Methode kann kein Verzeichnis erstellen, und wenn die Datei, die Sie bereits erstellen möchten, bereits vorhanden ist, wird eine neue Datei erstellt, um die Originaldatei zu überschreiben.
FileOUTRputStream File = new FileOutputStream ("Dateiname"); (4) Erhalten Sie eine Dateiliste
Erhalten Sie eine Dateiliste eines bestimmten Ordners über die Methode List () oder ListFiles () der Dateiklasse. Es gibt verschiedene Formen:
String [] list ();
Datei [] listFiles ();
Datei [] Listfiles (DateinameFilter -Filter);
Datei [] Listfiles (Dateifilter -Filter);
Darunter sind FileFilter und FilenameFilter beide Schnittstellen, und der Filter ist der entsprechende Filter. Deklarieren Sie eine bestimmte Klasse und implementieren Sie die Filterschnittstelle, damit alle übereinstimmenden Dateien durch Filterbedingungen aufgeführt werden können.
2. InputStream -Klasse und OutputStream -Klasse
Die Byte -Stream -Klasse ist eine Reihe von Klassen, die aus den abstrakten Klassen InputStream und OutputStream abgeleitet sind. Diese Art von Stream basiert auf Bytes. InputStream- und OutputStream -Klassen können verwendet werden, um Binärdateidaten zu verarbeiten, aber auch Textdateien zu verarbeiten.
1. Häufige Methoden der InputStream -Klasse
Die InputStream -Klasse ist die übergeordnete Klasse aller Eingangsströme. Alle Methoden dieser Klasse werfen eine IOException auf, wenn ein Fehler auftritt. Die Hauptmethoden sind:
(1) öffentliches abstraktes int read () diese ioException
Die Methode gibt eine Ganzzahl zwischen 0 und 255 oder -1 zurück, und -1 bedeutet, dass das Ende des Streams aufgetreten ist und andere entsprechende Bytes eingelesen wurden.
(2) Public int Read (Byte [] b) diese IOException
Die Methode liest Bytes in das vom Parameter angegebene Byte -Array, und der Rückgabewert ist die Anzahl der tatsächlich gelesenen Bytes in oder -1 (das Ende des Streams wird auftritt).
(3) Public int Read (Byte [] B, int i, int b) diese ioException
Die letzten beiden Parameter der Methode geben die Ausgangsposition der Lektüre bzw. die maximale Anzahl von Bytes an.
(4) öffentlich int verfügbar ()
Gibt die Anzahl der Bytes zurück, die im aktuellen Stream -Objekt nicht gelesen wurden. Das heißt, erhalten Sie die Datenlänge im Stream.
(5) öffentlicher langer Skip (langer n)
Überspringen Sie B -Bytes im aktuellen Stream -Objekt, und die tatsächliche Anzahl der übersprungenen Bytes wird als Rückgabewert zurückgegeben.
(6) Öffentliche Boolesche Marksupported ()
Stellen Sie fest, ob der Fluss Markierungen unterstützt und die Markierungen problemlos zur ursprünglichen Leseposition zurückkehren können.
(7) öffentliche Leere schließen ()
Schließen Sie das aktuelle Stream -Objekt und geben Sie die vom Stream -Objekt besetzten Ressourcen frei.
(8) Public Leerzeichen (int i)
Stellen Sie ein Flag für die aktuelle Position im Stream ein, damit Sie später weiterhin aus dieser Position aus lesen können.
(9) öffentlicher Leere Reset ()
Geben Sie die Position des Stream -Lesens an die Position der festgelegten Marke zurück.
2. Häufige Methoden der OutputStream -Klasse
Die OutputStream -Klasse ist die übergeordnete Klasse aller Ausgabeströme. Alle Methoden dieser Klasse geben void zurück und werfen eine IOException in einem Fehlerfall. Die Hauptmethoden sind:
(1) öffentliche Leere Schreiben (int b) wirft iOException aus
Schreiben Sie ein Datenbyte an das Ende des Streams.
(2) öffentliche Leere Schreiben (Byte [] B) löst IOException aus
Schreiben Sie die Daten in Array B nacheinander in das aktuelle Stream -Objekt.
(3) Public Leerdraht (Byte [] b, int i, int n)
Schreiben Sie Daten von nachfolgenden Längen im Array in der Sequenz von Anfang an in das Stream -Objekt (enthalten).
(4) öffentliche Leere Close ()
Schließen Sie das aktuelle Stream -Objekt und geben Sie die vom Stream -Objekt besetzten Ressourcen frei.
(5) öffentliche Leere Flush ()
Erzwingen Sie die gepufferten Daten im aktuellen Stream -Objekt aus. Verwenden Sie diese Methode, um eine sofortige Ausgabe zu erreichen.
Die meisten Methoden der beiden oben genannten Klassen werden durch Unterklassen von InputStream und OutputStream mit Ausnahme von Mark () und Reset () -Methoden überschrieben.
3.. FileInputStream -Klasse
Die FileInputStream -Klasse ist eine Unterklasse von InputStream, mit der Datenströme verarbeitet werden können, die Dateien als Dateneingangsquellen zum Implementieren von Dateien -Lesevorgängen verwenden.
Seine Baumethoden sind:
(1) FileInputStream (Datei f)
Erstellen Sie einen Dateieingabestream mit dem Dateiobjekt F mit dem angegebenen Namen als Datenquelle.
Wenn f existiert, sollte es sich um einen Dateipfad handeln. Wenn es sich um ein Verzeichnis handelt, wird eine IOException geworfen, aber wenn dieses Verzeichnis nicht vorhanden ist, wird es geworfen: FilenotFoundException wird geworfen.
(2) FileInputStream (String -Name)
Erstellen Sie einen Dateieingabestream mit einer Datei namens Name als Datenquelle.
(3) FileInputStream (Anmeldeskriptor F)
Erstellen Sie einen Dateieingabestream für das Eingabendende basierend auf dem Dateideskriptorobjekt f.
Seine Hauptmethode besteht darin, die Methoden der übergeordneten Klasse (inputStream -Klasse) zu überschreiben: read (), read (byte [] b), read (byte [] b, int i, int länge), übersprungen (lang n), verfügbar (), close ().
4. DateioutputStream -Klasse
Die DateiOutputStream -Klasse ist eine Unterklasse von OutputStream, mit der Datenströme nach Dateien als Daten verarbeitet und Schreibvorgänge in Dateien implementiert werden. Seine Baumethoden sind:
FileOutputStream (Datei f);
FileOutputStream (Datei F, Boolean B);
FileOutputStream (Zeichenfolge f);
Zu den Hauptmethoden gehören Methoden, die die Elternklasse abdecken: schreiben (int b), schreiben (byte [] b), schreiben (byte [] b, int off, int len), close () und flush ().
5. DataNputStream- und DataOutputStream -Klassen
Objekte, die durch DateInputStream- und DataOutputStream -Klassen erstellt wurden, werden als Dateneingabestreams bzw. Datenausgabestreams bezeichnet. Sie implementieren die DataNput -Schnittstelle und die DataOutput -Schnittstelle. Die DateInputStream -Klasse und das DataOutputStream -Objekt ermöglichen das Lesen verschiedener Arten von Java -Daten.
Diese beiden Streams gehören zu Filterströmen, und andere Streams wie InputStream oder OutputStream werden häufig als Eingang oder Ausgang verwendet. Zum Beispiel:
FileInputStream fis = new FileInputStream ("d: //a.txt");
DataNputStream dis = new DataNputStream (FIS);
FileOutputStream fos = new FileOutputStream ("d: //a.txt");
DataOutputStream dos = neuer DataOutputStream (FOS);
Die Eingabe und Ausgabe von DateInputStream und DataOutputStream sind fast entsprechend. Die Lese- und Schreibmethoden jedes grundlegenden Datentyps können aus seinem Suffixnamen identifiziert werden. Zum Beispiel:
Readint (), writeInt () // Lesen und schreiben Sie einen int -Wert
ReadBoolean (), writeBoolean () // Lesen und schreiben Sie einen booleschen Wert
ReadChar (), Writechar () // Lesen und schreiben Sie einen Charakter
ReadDouble (), WritedoUble () // Lesen und schreiben Sie einen doppelten Präzisionsschwimmpunktwert und schreiben Sie
Readfloat (), WriteFloat () // Lesen und schreiben Sie einen einzelnen Precision-Gleitpunktwert
WriteChars () // Schreiben Sie eine Zeichenfolge, aber es gibt keine Möglichkeit, die Zeichenfolge direkt zu lesen
3. Leserklasse und Schriftstellerklasse
Zeichen in Java verwenden Unicode -Codierung, jedes Zeichen hat zwei Bytes, dh 16 Bit. Charakterströme basieren auf Zeichen, die durch 16-Bit-Unicode-Codes dargestellt werden, und lesen und schreiben Textdaten, die die Konvertierung zwischen internen Formaten in Java-Programmen und externen Formaten wie Textdateien, Ausgänge, Tastatureingaben usw. realisieren können. Diese Methode ist besonders für den Betrieb chinesischer Zeichen geeignet. Wenn chinesische Zeichen in Bytes arbeiten, ist es möglich, verstümmelten Code auszugeben.
Leser und Schriftsteller sind abstrakte übergeordnete Klassen aller Charakterströme im Java.io -Paket und definieren Schlüsselmethoden zur Implementierung anderer Stream -Klassen. Die beiden wichtigsten werden gelesen () und schreiben (), die Charakterdaten lesen und schreiben. Die Methoden der Leser- und Schriftstellerklassen und deren Unterklassen sind den Methoden der Verwendung von InputStream -Klassen, OutputStream -Klassen und deren Unterklassen sehr ähnlich. Die darin enthaltenen Parameter werden jedoch durch Zeichen oder Zeichenarrays ersetzt.
1. Häufige Methoden der Leserklasse und der Schriftstellerinklasse
Die Leserklasse ist eine abstrakte Klasse. Alle Methoden dieser Klasse werfen eine IOException -Ausnahme unter Fehlerbedingungen. Häufige Methoden sind wie folgt:
(1) Abstract void Close (): Schließen Sie die Eingangsquelle.
(2) Hohlraummarke (int numchars): Platzieren Sie eine Marke in den aktuellen Punkt der Eingangsquelle.
(3) Boolean marksSupported (): Wenn dieser Stream die Mark/Reset -Methode unterstützt, wird True zurückgegeben.
(4) int read (): Lesen Sie ein einzelnes Zeichen.
(5) INT Read (char [] buf): Lesen Sie Zeichen in das Charakter -Array.
(6) Abstract Int Read (char [] buf, int offset, int numchars): Lesen Zeichen in einen Teil des Arrays.
(7) Boolean Ready (): RETURE TRUE, wenn die nächste Eingabemestütze nicht warten muss, andernfalls geben Sie false zurück.
(8) Hohlraum Reset (): Setzen Sie den Eingangszeiger auf den zuvor markierten Satz zurück.
(9) Long Skip (Long Numchars): Überspringen Sie die N -Zeicheneingabe und senden Sie die tatsächliche Anzahl der übersprungenen Zeichen zurück.
Die Autor -Klasse ist auch eine abstrakte Klasse, und die häufig verwendeten Methoden sind wie folgt:
(1) Abstract Leer Close (): Schließen Sie den Ausgangsstrom.
(2) Abstract void Flush (): Bestimmen Sie den Ausgangsstatus, um einen beliebigen Cache zu löschen.
(3) void write (int ch): Schreiben Sie ein einzelnes Zeichen.
(4) void write (char [] buf): Schreiben Sie in ein Charakter -Array.
(5) Abstract Leerschreiber (char [] buf, int offset, int numchars): Schreiben Sie einen Teil des Zeichenarrays.
(6) void write (String str): Schreiben Sie eine Zeichenfolge.
(7) void write (String str, int offset, int numchars): Schreiben Sie einen Teil der Zeichenfolge.
2. FileReader -Klasse
Die FileReader -Klasse erbt von der InputStreamReader -Klasse und der InputStreamReader -Klasse der Leserklasse. Daher können die von der Leserklasse und der InputStreamReader -Klasse bereitgestellten Methoden für Objekte verwendet werden, die von der FileReader -Klasse erstellt wurden. Die Konstruktormethoden von FileReader sind:
FileReader (Dateidatei);
FileReader (fileedescriptor e);
FileReader (String Dateiname);
3.. FileWriter -Klasse
Die Filewriter -Klasse erbt aus der OutputStreamWriter -Klasse und der OutputStreamWriter -Klasse erbt aus der Schriftstellungsklasse. Daher können die von der Schriftstellungsklasse und der OutputStreamWriter -Klasse bereitgestellten Methoden von den von der Filewriter -Klasse erstellten Objekte verwendet werden. Die Konstruktormethoden des Filewriter sind:
FileWrite (Datei filepath);
FileWrite (Datei F, Boolean Append);
FileWrite (AnregungScriptor E);
Dateiwrite (String -Dateiname);
Dateiwrite (String -Dateiname, Boolean Append);
4. BufferedReader -Klasse
Die BufferedReader -Klasse erbt aus der Leserklasse, mit der Daten im Puffer gelesen werden. Die BufferedReader -Klasse gehört zum Filterströmen, und andere Streams wie FileReader werden häufig als Eingang oder Ausgabe verwendet. Seine Baumethoden sind:
BufferedReader (Leser in);
BufferedReader (Leser in, int bufsize);
Zum Beispiel:
FileReader fr = new FileReader ("d: /1.txt");
BufferedReader buf = neuer BufferedReader (FR);
BufferedReader bietet die methode readerline (), um jede Textzeile zu lesen.
5. BufferedWriter -Klasse
Die BufferedWriter -Klasse erbt aus der Schriftstellungsklasse, und die BufferedWriter -Klasse wird verwendet, um Daten in den Puffer zu schreiben. Die Verwendung der BufferedWriter -Klasse ähnelt der Verwendung der BufferedReader -Klasse. Der Unterschied besteht darin, dass die Daten im Puffer am Ende mit der Flush () -Methode gelöscht werden müssen, dh alle Daten in den Puffer in die Datei schreiben. Seine Baumethoden sind:
Bufferterwriter (Schriftsteller Out);
BufferedWriter (Writer Out, int bufsize);
4. RandomAccessfile -Klasse
Der Zufallsdateizugriff in Java erfordert die Verwendung der RandomAccessfile -Klasse (diese Klasse ermöglicht den Zugriff von jedem Ort, nicht nur lesen, sondern auch schreiben), der direkt aus der Objektklasse erbt und die Schnittstellen DataNput und DataOutput implementiert.
Da die RandomAccessfile -Klasse alle in den Schnittstellen von DataNput und DataOutput definierten Methoden implementiert, können Grundtypdaten aus der Datei gelesen und grundlegende Typdaten in die Datei schreiben. Zusätzlich zu den in den Schnittstellen von DataNput und DataOutput definierten Methoden definiert die RandomAccessfile -Klasse auch einige andere Methoden zur Unterstützung des Zufallszugriffs.
Der von der RandomAccessfile -Klasse erstellte Stream unterscheidet sich von den vorherigen Eingangs- und Ausgabestreams. Die RandomAccessfile -Klasse ist weder eine Unterklasse der Eingabestream -Klasse in der Eingangsstromklasse noch eine Unterklasse der OutputStream -Klasse in der Ausgabestream -Klasse. Die Richtung des von der RandomAccessfile -Klasse erstellten Streams kann jedoch sowohl als Quelle als auch als Ziel verwendet werden. Mit anderen Worten, beim Lesen und Schreiben einer Datei können Sie einen RandomAccessfile -Stream erstellen, der auf die Datei zeigt, damit Sie die Daten der Datei aus dem Stream lesen und Daten über den Stream in die Datei schreiben können.
Zwei Konstruktormethoden der RandomAccessfile -Klasse:
(1) RandomAccessfile (String -Name, String -Modus)
Der Parametername wird verwendet, um einen Dateinamen zu bestimmen, der die Quelle (auch das Flussziel) des erstellten Streams angibt, und der Parametermodus dauert R (schreibgeschützt) oder RW (readebritierbar), wodurch die Zugriffsrechte des erstellten Streams zur Datei bestimmt werden.
(2) RandomAccessfile (Dateidatei, String -Modus)
Die Parameterdatei ist ein Dateiobjekt, das die Quelle (auch das Ziel des Streams) angibt. Der Parametermodus dauert R (schreibgeschützt) oder RW (readschreibar) und bestimmt die Zugriffsrechte des erstellten Streams zur Datei. Beim Erstellen eines Objekts sollte die FilenotFoundException gefangen werden. Wenn der Stream Lese- und Schreibvorgänge ausführt, sollte die IOException gefangen werden.
Die Methode zum Lesen und Schreiben von Informationen des Objekts RandomAccessfile entspricht der Eingabemethode und der Ausgabe des Datenobjekts. Es kann in den Klassen DataNputStream und DataOutputStream auf alle Methoden read () und write () zugreifen.
So verschieben Sie die Datei lesen und schreiben Zeiger:
(1) Langes GetFilePointer (): Gibt den aktuellen Speicherort des Dateizeigers zurück.
(2) Hohlraumsuche (Long POS): Platzieren Sie den Dateizeiger in die angegebene absolute Position. Der Positionswert wird als Byte -Offset POS aus dem Start der Datei berechnet. POS ist 0, was den Beginn der Datei darstellt.
(3) Langlänge (): Gibt die Länge der Datei zurück. Der Positionswert ist Länge (), der das Ende der Datei darstellt.