JavaRush /Java-Blog /Random-DE /E/A in Java. Klassen FileInputStream, FileOutputStream, B...

E/A in Java. Klassen FileInputStream, FileOutputStream, BufferedInputStream

Veröffentlicht in der Gruppe Random-DE
Hallo! In der heutigen Vorlesung werden wir das Gespräch über Eingabe- und Ausgabeströme in Java, kurz Java I/O („Eingabe-Ausgabe“), fortsetzen. Dies ist nicht die erste Vorlesung zu diesem Thema und es wird auch nicht die letzte sein :) Es ist einfach so, dass Java als Sprache viele Möglichkeiten für die Arbeit mit Eingabe/Ausgabe bietet. Es gibt eine ganze Reihe von Klassen, die diese Funktionalität implementieren, daher haben wir sie in mehrere Vorlesungen unterteilt, damit Sie zunächst nicht verwirrt werden :) In früheren Vorlesungen haben wir BufferedReader sowie die abstrakten Klassen InputStream & OutputStream und mehrere E/A in Java.  Klassen FileInputStream, FileOutputStream, BufferedInputStream – 1angesprochen Nachkommenschaft. Heute werden wir uns drei neue Klassen ansehen: FileInputStream , FileOutputStream und BufferedInputStream .

FileOutputStream-Klasse

Der Hauptzweck der FileOutputStream- Klasse besteht darin, Bytes in eine Datei zu schreiben. Nichts Kompliziertes :) FileOutputStream ist eine der Implementierungen der abstrakten OutputStream- Klasse . Im Konstruktor nehmen Objekte dieser Klasse entweder den Pfad zur Zieldatei (in die die Bytes geschrieben werden müssen) oder ein Objekt der Klasse an File. Schauen wir uns beide Beispiele an:
public class Main {

   public static void main(String[] args) throws IOException {


       File file = new File("C:\\Users\\Username\\Desktop\\test.txt");
       FileOutputStream fileOutputStream = new FileOutputStream(file);

       String greetings = „Hallo! Willkommen bei JavaRush – der besten Seite für alle, die Programmierer werden wollen!“;

       fileOutputStream.write(greetings.getBytes());

       fileOutputStream.close();
   }
}
Beim Erstellen eines Objekts Filehaben wir im Konstruktor den Pfad angegeben, in dem es sich befinden soll. Es ist nicht erforderlich, es im Voraus zu erstellen. Wenn es nicht vorhanden ist, erstellt das Programm es selbst. Sie können auf die Erstellung eines zusätzlichen Objekts verzichten und einfach einen String mit der Adresse übergeben:
public class Main {

   public static void main(String[] args) throws IOException {


       FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt");

       String greetings = „Hallo! Willkommen bei JavaRush – der besten Seite für alle, die Programmierer werden wollen!“;

       fileOutputStream.write(greetings.getBytes());

       fileOutputStream.close();
   }
}
Das Ergebnis wird in beiden Fällen das gleiche sein. Wir können unsere Datei öffnen und dort sehen:

Hallo! Добро пожаловать на JavaRush — лучший сайт для тех, кто хочет стать программистом!
Allerdings gibt es hier eine Einschränkung. Versuchen Sie, den Code aus dem obigen Beispiel mehrmals hintereinander auszuführen, schauen Sie sich dann die Datei an und beantworten Sie die Frage: Wie viele Zeilen sehen Sie darin geschrieben? Nur einer. Aber Sie haben den Code mehrmals ausgeführt. Es stellte sich jedoch heraus, dass die Daten jedes Mal überschrieben wurden und die alten ersetzten. Was ist, wenn wir damit nicht zufrieden sind und eine sequentielle Aufzeichnung benötigen? Was wäre, wenn wir unsere Begrüßung dreimal hintereinander in eine Datei schreiben möchten? Hier ist alles einfach. Da die Sprache selbst nicht wissen kann, welches Verhalten wir jeweils benötigen, FileOutputStreamkönnen Sie dem Konstruktor einen zusätzlichen Parameter übergeben – boolean append. Wenn der Wert true ist , werden die Daten an das Ende der Datei geschrieben. Bei „false“ (und der Standardwert ist „false “) werden alte Daten gelöscht und neue Daten geschrieben. Lassen Sie uns unseren geänderten Code dreimal testen und ausführen:
public class Main {

   public static void main(String[] args) throws IOException {


       FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt", true);

       String greetings = „Hallo! Willkommen bei JavaRush – der besten Seite für alle, die Programmierer werden wollen!\r\n“;

       fileOutputStream.write(greetings.getBytes());

       fileOutputStream.close();
   }
}
Ergebnis in der Datei:

Hallo! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hallo! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Hallo! Добро пожаловать на JavaRush - лучший сайт для тех, кто хочет стать программистом!
Etwas anderes! Beachten Sie diese Funktion, wenn Sie I/O-Klassen verwenden. Früher musste ich stundenlang an Aufgaben sitzen, um zu verstehen, wohin meine alten Daten aus den Dateien gelangten :) Und natürlich, wie bei anderen I/O-Klassen, vergessen Sie nicht, Ressourcen über die freizugeben close().

FileInputStream-Klasse

Die Klasse hat FileInputStreamden gegenteiligen Zweck – das Lesen von Bytes aus einer Datei. Genau wie FileOutputStreaminherits OutputStreamleitet sich diese Klasse von der abstrakten Klasse ab InputStream. Schreiben wir mehrere Textzeilen in unseren Text „ test.txt “:

«So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters»
E/A in Java.  Klassen FileInputStream, FileOutputStream, BufferedInputStream – 2 Dies ist die Implementierung des Lesens von Daten aus einer Datei mithilfe von FileInputStream:
public class Main {

   public static void main(String[] args) throws IOException {

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");

       int i;

       while((i=fileInputStream.read())!= -1){

           System.out.print((char)i);
       }
   }
}
Wir lesen ein Byte aus der Datei, wandeln die gelesenen Bytes in Zeichen um und geben sie auf der Konsole aus. Und hier ist das Ergebnis in der Konsole:

So close no matter how far
Couldn't be much more from the heart
Forever trusting who we are
And nothing else matters

BufferedInputStream-Klasse

Ich denke, angesichts des Wissens aus früheren Vorlesungen kann man leicht erkennen, warum der Kurs benötigt wird BufferedInputStreamund welche Vorteile er gegenüber hat FileInputStream:) Wir haben bereits gepufferte Streams kennengelernt, also versuchen Sie es zu erraten (oder sich daran zu erinnern), bevor Sie weiterlesen :) Gepufferte Streams werden vor allem zur I/O-Optimierung benötigt. Der Zugriff auf eine Datenquelle, beispielsweise das Lesen einer Datei, ist ein leistungsintensiver Vorgang. Und der Zugriff auf die Datei, um jedes Mal ein Byte zu lesen, ist verschwenderisch. Daher BufferedInputStreamliest es Daten nicht byteweise, sondern blockweise und speichert sie vorübergehend in einem speziellen Puffer. Dadurch können wir den Betrieb des Programms optimieren, indem wir die Anzahl der Zugriffe auf die Datei reduzieren. Mal sehen, wie es aussieht:
public class Main {

   public static void main(String[] args) throws IOException {

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\test.txt");

       BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream, 200);

       int i;

       while((i = bufferedInputStream.read())!= -1){

           System.out.print((char)i);
       }
   }
}
Hier haben wir ein Objekt erstellt BufferedInputStream. Es akzeptiert ein Objekt oder einen seiner Nachfolger als Eingabe InputStream, sodass das vorherige Objekt FileInputStreamausreicht. Als zusätzlichen Parameter wird die Puffergröße in Bytes verwendet. Dadurch werden die Daten nun nicht mehr Byte für Byte aus der Datei gelesen, sondern 200 Bytes auf einmal! Stellen Sie sich vor, wie stark wir die Anzahl der Dateizugriffe reduziert haben. Um die Leistung zu vergleichen, können Sie eine große Textdatei mit einer Größe von mehreren Megabyte nehmen und mit und vergleichen, wie lange es dauert, sie zu lesen und in Millisekunden an die Konsole FileInputStreamauszugeben BufferedInputStream. Hier sind beide Codebeispiele:
public class Main {

   public static void main(String[] args) throws IOException {

       Date date = new Date();

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\textBook.rtf");

       BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);

       int i;

       while((i = bufferedInputStream.read())!= -1){

           System.out.print((char)i);
       }

       Date date1 = new Date();

       System.out.println((date1.getTime() - date.getTime()));
   }
}



public class Main {

   public static void main(String[] args) throws IOException {

       Date date = new Date();

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\26951280.rtf");


       int i;

       while((i = fileInputStream.read())!= -1){

           System.out.print((char)i);
       }

       Date date1 = new Date();

       System.out.println((date1.getTime() - date.getTime()));
   }
}
Beim Lesen einer 1,5-MB-Datei auf meinem Computer FileInputStreamerledigte es die Aufgabe in etwa 3500 Millisekunden, aber hier BufferedInputStreamerledigte es die Aufgabe in etwa 1700 Millisekunden. Wie Sie sehen, hat der gepufferte Stream die Leistung des Programms um das Zweifache optimiert! :) Wir werden weiterhin I/O-Kurse studieren – bis bald!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION