Das Java.io-Paket enthält fast alle Klassen, die für den Betrieb von Ein- und Ausgaben erforderlich sind. Alle diese Stream-Klassen repräsentieren Eingabequellen und Ausgabeziele.
Streams im Java.io-Paket unterstützen viele Formate, wie z. B. Basistypen, Objekte, lokalisierte Zeichensätze usw.
Ein Stream kann als eine Folge von Daten verstanden werden. Ein Eingabestream stellt das Lesen von Daten aus einer Quelle dar, und ein Ausgabestream stellt das Schreiben von Daten an ein Ziel dar.
Java bietet leistungsstarke und flexible Unterstützung für I/O, wodurch es häufiger bei der Dateiübertragung und Netzwerkprogrammierung eingesetzt wird.
In diesem Abschnitt werden jedoch die grundlegendsten Funktionen im Zusammenhang mit Streams und E/A behandelt. Wir werden diese Funktionen einzeln anhand von Beispielen erlernen.
Die Konsoleneingabe von Java erfolgt über System.in.
Um einen an die Konsole gebundenen Zeichenstrom zu erhalten, können Sie System.in in ein BufferedReader-Objekt einschließen, um einen Zeichenstrom zu erstellen.
Das Folgende ist die grundlegende Syntax zum Erstellen eines BufferedReader:
BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in));
Nachdem das BufferedReader-Objekt erstellt wurde, können wir die Methode read() verwenden, um ein Zeichen von der Konsole zu lesen, oder die Methode readLine(), um eine Zeichenfolge zu lesen.
Um ein Zeichen aus einem BufferedReader-Objekt zu lesen, verwenden Sie die Methode read(), deren Syntax wie folgt lautet:
intread()throwsIOException
Jedes Mal, wenn die Methode read() aufgerufen wird, liest sie ein Zeichen aus dem Eingabestream und gibt dieses Zeichen als ganzzahligen Wert zurück. Gibt -1 zurück, wenn der Stream endet. Diese Methode löst eine IOException aus.
Das folgende Programm demonstriert die Verwendung der read()-Methode zum kontinuierlichen Lesen von Zeichen aus der Konsole, bis der Benutzer „q“ eingibt.
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRRead{ publicstaticvoidmain(Stringargs[])throwsIOException { charc; //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); System.out.println("输入字符, 按下'q' 键退出."); //读取字符do{ c=(char)br.read(); System.out.println(c); }while(c!='q'); } }
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
输入字符, 按下'q' 键退出. 123abcq 1 2 3 a b c q
Das Lesen einer Zeichenfolge aus der Standardeingabe erfordert die Verwendung der readLine()-Methode von BufferedReader.
Sein allgemeines Format ist:
StringreadLine()throwsIOException
Das folgende Programm liest und zeigt Zeichenzeilen an, bis Sie das Wort „Ende“ eingeben.
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRReadLines{ publicstaticvoidmain(Stringargs[])throwsIOException { //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); Stringstr; System.out.println("Enterlinesoftext."); System.out.println("Enter'end'toquit."); do{ str=br.readLine(); System.out.println(str); }while(!str.equals("end")); } }
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
Enterlinesoftext. Enter'end'toquit. Thisislineone Thisislineone Thisislinetwo Thisislinetwo end end
Wie bereits erwähnt, wird die Konsolenausgabe durch print() und println() abgeschlossen. Diese Methoden werden von der PrintStream-Klasse definiert und System.out ist eine Referenz auf das Objekt dieser Klasse.
PrintStream erbt die OutputStream-Klasse und implementiert die Methode write(). Auf diese Weise können mit write() auch Operationen auf die Konsole geschrieben werden.
PrintStream definiert write() in seiner einfachsten Form wie folgt:
voidwrite(intbyteval)
Diese Methode schreibt die unteren Oktette von Byteval in den Stream.
Im folgenden Beispiel wird write() verwendet, um das Zeichen „A“ gefolgt von einem Zeilenumbruchzeichen auf dem Bildschirm auszugeben:
importjava.io.*; //演示System.out.write(). publicclassWriteDemo{ publicstaticvoidmain(Stringargs[]){ intb; b='A'; System.out.write(b); System.out.write('n'); } }
Führen Sie das obige Beispiel aus, um das Zeichen „A“ im Ausgabefenster auszugeben.
A
Hinweis: Die Methode write() wird nicht oft verwendet, da die Methoden print() und println() bequemer zu verwenden sind.
Wie bereits erwähnt, ist ein Stream als eine Folge von Daten definiert. Der Eingabestream wird zum Lesen von Daten aus der Quelle und der Ausgabestream zum Schreiben von Daten in das Ziel verwendet.
Die folgende Abbildung ist ein Klassenhierarchiediagramm, das den Eingabestream und den Ausgabestream beschreibt.
Die beiden wichtigen Streams, die im Folgenden besprochen werden, sind FileInputStream und FileOutputStream:
Dieser Stream wird zum Lesen von Daten aus einer Datei verwendet und seine Objekte können mit dem Schlüsselwort new erstellt werden.
Zum Erstellen von Objekten werden verschiedene Konstruktormethoden verwendet.
Sie können einen String-Dateinamen verwenden, um ein Eingabestream-Objekt zum Lesen der Datei zu erstellen:
InputStreamf=newFileInputStream("C:/java/hello");
Sie können ein Dateiobjekt auch verwenden, um ein Eingabestreamobjekt zum Lesen der Datei zu erstellen. Wir müssen zunächst ein Dateiobjekt mit der Methode File() erstellen:
Filef=newFile("C:/java/hello"); InputStreamf=newFileInputStream(f);
Nachdem Sie ein InputStream-Objekt erstellt haben, können Sie die folgenden Methoden verwenden, um den Stream zu lesen oder andere Stream-Vorgänge auszuführen.
Seriennummer | Methoden und Beschreibung |
---|---|
1 | public void close() throws IOException{} Schließt diesen Dateieingabestream und gibt alle mit diesem Stream verbundenen Systemressourcen frei. Löst eine IOException aus. |
2 | protected void finalize()throws IOException {} Diese Methode löscht die Verbindung zur Datei. Stellen Sie sicher, dass Sie die Close-Methode des Dateieingabestreams aufrufen, wenn nicht mehr darauf verwiesen wird. Löst eine IOException aus. |
3 | public int read(int r)throws IOException{} Diese Methode liest angegebene Datenbytes aus dem InputStream-Objekt. Wird als ganzzahliger Wert zurückgegeben. Gibt das nächste Datenbyte zurück oder -1, wenn das Ende erreicht wurde. |
4 | public int read(byte[] r) throws IOException{} Diese Methode liest r.length Bytes aus dem Eingabestream. Gibt die Anzahl der gelesenen Bytes zurück. Wenn es das Ende der Datei ist, wird -1 zurückgegeben. |
5 | public int available() throws IOException{} Gibt die Anzahl der Bytes zurück, die aus diesem Eingabestream gelesen werden können, ohne dass der nächste Methodenaufruf für diesen Eingabestream blockiert. Gibt einen ganzzahligen Wert zurück. |
Zusätzlich zu InputStream gibt es noch einige andere Eingabeströme. Weitere Informationen finden Sie unter dem folgenden Link:
ByteArrayInputStream
DataInputStream
Mit dieser Klasse wird eine Datei erstellt und Daten in die Datei geschrieben.
Wenn die Zieldatei nicht vorhanden ist, bevor der Stream die Datei zur Ausgabe öffnet, erstellt der Stream die Datei.
Es gibt zwei Konstruktoren, die zum Erstellen von FileOutputStream-Objekten verwendet werden können.
Erstellen Sie ein Ausgabestream-Objekt mit einem String-Dateinamen:
OutputStreamf=newFileOutputStream("C:/java/hello")
Sie können ein Dateiobjekt auch verwenden, um einen Ausgabestream zum Schreiben in die Datei zu erstellen. Wir müssen zunächst ein Dateiobjekt mit der Methode File() erstellen:
Filef=newFile("C:/java/hello"); OutputStreamf=newFileOutputStream(f);
Nachdem Sie das OutputStream-Objekt erstellt haben, können Sie die folgenden Methoden verwenden, um in den Stream zu schreiben oder andere Stream-Vorgänge auszuführen.
Seriennummer | Methoden und Beschreibung |
---|---|
1 | public void close() throws IOException{} Schließt diesen Dateieingabestream und gibt alle mit diesem Stream verbundenen Systemressourcen frei. Löst eine IOException aus. |
2 | protected void finalize()throws IOException {} Diese Methode löscht die Verbindung zur Datei. Stellen Sie sicher, dass Sie die Close-Methode des Dateieingabestreams aufrufen, wenn nicht mehr darauf verwiesen wird. Löst eine IOException aus. |
3 | public void write(int w)throws IOException{} Diese Methode schreibt die angegebenen Bytes in den Ausgabestream. |
4 | public void write(byte[] w) schreibt die Bytes der Länge w.length im angegebenen Array in OutputStream. |
Zusätzlich zu OutputStream gibt es noch einige andere Ausgabestreams. Weitere Informationen finden Sie unter dem folgenden Link:
ByteArrayOutputStream
DataOutputStream
Hier ist ein Beispiel, das die Verwendung von InputStream und OutputStream demonstriert:
import java.io.*; public class fileStreamTest { public static void main(String args[]) { try { byte bWrite[] = { 11, 21, 3, 40, 5 }; OutputStream os = new FileOutputStream("test.txt"); for (int x = 0; x < bWrite.length; x++) { os.write(bWrite[x]); // writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for (int i = 0; i < size; i++) { System.out.print((char) is.read() + " "); } is.close(); } catch (IOException e) { System.out.print("Exception"); } } }
Das obige Programm erstellt zunächst die Datei test.txt, schreibt die angegebene Zahl in binärer Form in die Datei und gibt sie auf der Konsole aus.
Da der obige Code im Binärformat geschrieben ist, kann es zu verstümmelten Zeichen kommen. Sie können die folgenden Codebeispiele verwenden, um das Problem des verstümmelten Codes zu lösen:
//文件名:fileStreamTest2.java importjava.io.*; publicclassfileStreamTest2{ publicstaticvoidmain(String[]args)throwsIOException{ Filef=newFile("a.txt"); FileOutputStreamfop=newFileOutputStream(f); //构建FileOutputStream对象,文件不存在会自动新建OutputStreamWriterwriter=newOutputStreamWriter(fop,"UTF-8"); //构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk writer.append("中文输入"); //写入到缓冲区writer.append("rn"); //换行writer.append("English"); //刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入writer.close(); //关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉fop.close(); //关闭输出流,释放系统资源 FileInputStreamfip=newFileInputStream(f); //构建FileInputStream对象InputStreamReaderreader=newInputStreamReader(fip,"UTF-8"); //构建InputStreamReader对象,编码与写入相同 StringBuffersb=newStringBuffer(); while(reader.ready()){ sb.append((char)reader.read()); //转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); //关闭读取流fip.close(); //关闭输入流,释放系统资源 } }
Es gibt auch einige Klassen zu Dateien und E/A, die wir ebenfalls kennen müssen:
Dateiklasse (Klasse)
FileReader-Klasse(Klasse)
FileWriter-Klasse (Klasse)
In der File-Klasse gibt es zwei Methoden, mit denen Ordner erstellt werden können:
Die mkdir()- Methode erstellt einen Ordner und gibt bei Erfolg „true“ und bei einem Fehlschlag „false“ zurück. Ein Fehler weist darauf hin, dass der vom Dateiobjekt angegebene Pfad bereits vorhanden ist oder dass der Ordner nicht erstellt werden kann, da der gesamte Pfad noch nicht vorhanden ist.
Die Methode mkdirs() erstellt einen Ordner und alle seine übergeordneten Ordner.
Das folgende Beispiel erstellt den Ordner „/tmp/user/java/bin“:
importjava.io.File; publicclassCreateDir{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp/user/java/bin"; Filed=newFile(dirname); //现在创建目录d.mkdirs(); } }
Kompilieren Sie den obigen Code und führen Sie ihn aus, um das Verzeichnis „/tmp/user/java/bin“ zu erstellen.
Hinweis: Java löst Dateipfadtrennzeichen automatisch gemäß der Konvention unter UNIX und Windows auf. Wenn Sie in der Windows-Version von Java das Trennzeichen (/) verwenden, wird der Pfad trotzdem korrekt analysiert.
Ein Verzeichnis ist eigentlich ein Dateiobjekt, das andere Dateien und Ordner enthält.
Wenn Sie ein File-Objekt erstellen und es sich um ein Verzeichnis handelt, gibt der Aufruf der Methode isDirectory() true zurück.
Sie können die Liste der darin enthaltenen Dateien und Ordner extrahieren, indem Sie die Methode list() für das Objekt aufrufen.
Das unten gezeigte Beispiel zeigt, wie Sie mit der list()-Methode den Inhalt eines Ordners überprüfen:
importjava.io.File; publicclassDirList{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp"; Filef1=newFile(dirname); if(f1.isDirectory()){ System.out.println("Directoryof"+dirname); Strings[]=f1.list(); for(inti=0;i<s.length;i++){ Filef=newFile(dirname+"/"+s[i]); if(f.isDirectory()){ System.out.println(s[i]+"是一个目录"); }else{ System.out.println(s[i]+"是一个文件"); } } }else{ System.out.println(dirname+"不是一个目录");
} } }
Die Kompilierungs- und Ausführungsergebnisse des obigen Beispiels lauten wie folgt:
目录/tmp bin 是一个目录lib 是一个目录demo 是一个目录test.txt 是一个文件README 是一个文件index.html 是一个文件include 是一个目录
Um eine Datei zu löschen, verwenden Sie die Methode java.io.File.delete().
Der folgende Code löscht das Verzeichnis /tmp/java/. Beachten Sie, dass Sie beim Löschen eines bestimmten Verzeichnisses sicherstellen müssen, dass sich keine anderen Dateien im Verzeichnis befinden, um es korrekt zu löschen, da sonst der Löschvorgang fehlschlägt.
Struktur des Testverzeichnisses:
/tmp/java/ |-- 1.log |-- Test
import java.io.File; public class DeleteFileDemo { public static void main(String args[]) { // 这里修改为自己的测试目录File folder = new File("/tmp/java/"); deleteFolder(folder); } // 删除文件及目录public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); } }