Lassen Sie uns IO unter verschiedenen Gesichtspunkten klassifizieren
__Vorteile der Verwendung von Streams auf hoher Ebene __
Es gibt mehr als 40 IO-bezogene Klassen in Java, InputStream / Reader und OutputStream / Writer sind Basisklassen.
Einstufung | byte input stream | byte output stream | char input stream | char output stream |
---|---|---|---|---|
Abstrakte Basis | InputStream | OutputStream | Reader | Writer |
Datei IO | FileInputStream | FileOutputStream | FileReader | FileWriter |
Array IO | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
Inter-Thread-E / A. | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
String IO | StringReader | StringWriter | ||
Pufferfunktion | BufferdInputStream | BufferdOutputStream | BufferdReader | BufferdWriter |
Byte⇒char Betriebsumwandlung | InputStreamReader | OutputStreamWriter | ||
Objekt IO | ObjectInputStream | ObjectOutputStream | ||
Abstrakte Basis? | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
PrintStream | PrintWriter | |||
pushback! | PushbackInputStream | PushbackReader | ||
Besonderer Typ | DataInputStream | DataOutputStream |
FileInputStream/FileOutputStream, FileReader/FileWriter Da es sich um einen direkten Festplattenzugriff handelt, handelt es sich um einen Stream auf niedriger Ebene.
file-input.txt
abcd1\r\n
Ah
FileInputStream
try (FileInputStream fi = new FileInputStream("./FileIOSample/file-input.txt")) {
//4 Byte Puffer
byte[] buff = new byte[4];
//Anzahl der gelesenen Bytes
int hasRead = 0;
//Lesen Sie bis zum Buff
while ((hasRead = fi.read(buff)) > 0) {
//Konvertieren Sie das gelesene Byte in eine Zeichenfolge und geben Sie es aus
System.out.println(new String(buff, 0, hasRead));
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
Ausgabe
abcd
1
�
���
�
abcd: Erste 4-Byte-Ausgabe 1 \ r \ n.: Die erste Hälfte (1 Byte) von "A" wurde genommen, also sind die Zeichen verstümmelt! ���: Die zweite Hälfte von "A" (1 Byte) + 3 Bytes, also sind die Zeichen verstümmelt!
__ Fazit __: Erfasst jeweils die angegebenen Bytes. Bei Mehrbyte-Zeichen können die Zeichen verstümmelt sein.
FileReader
try (FileReader fr = new FileReader("./FileIOSample/file-input.txt")) {
//4 Zeichen Puffer
char[] buff = new char[4];
//Anzahl der gelesenen Zeichen
int hasRead = 0;
//Lesen Sie bis zum Buff
while ((hasRead = fr.read(buff)) > 0) {
//Konvertieren Sie das gelesene Byte in eine Zeichenfolge und geben Sie es aus
System.out.println(new String(buff, 0, hasRead));
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
Ausgabe
abcd
1
Ah
Sagen
abcd: 4-stellige Ausgabe 1 \ r \ n A: 4-Zeichen-Ausgabe Sprich: Gib die letzten 2 Zeichen aus
__ Fazit __:
FileOutputStream/FileWriter
FileInputStream
try (
FileInputStream fi = new FileInputStream("./FileIOSample/file-input.txt")) {
FileOutputStream fo = new FileOutputStream("./FileIOSample/file-output-1.txt");
//4 Byte Puffer
byte[] buff = new byte[4];
//Anzahl der gelesenen Einheiten(Anzahl der Bytes)
int hasRead = 0;
while ((hasRead = fi.read(buff)) > 0) {
//Schreiben Sie so viel wie Sie lesen
fo.write(buff, 0, hasRead);
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
try (
FileReader fr = new FileReader("./FileIOSample/file-input.txt");
FileWriter fo = new FileWriter("./FileIOSample/file-output-2.txt")) {
//4 Zeichen Puffer
char[] buff = new char[4];
//Anzahl der gelesenen Einheiten(Anzahl der Bytes)
int hasRead = 0;
while ((hasRead = fr.read(buff)) > 0) {
//Schreiben Sie so viel wie Sie lesen
fo.write(buff, 0, hasRead);
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
file-output-1.txt
abcd1
Ah
file-output-2.txt
abcd1
Ah
__ Fazit __: Sowohl Byte- als auch Zeichenoperationen können normal ausgegeben werden.
Wenn eine Zeichenfolge ausgegeben wird
FileWriter fo = new FileWriter("./FileIOSample/file-output-3.txt")) {
fo.write("Linie 1");
fo.write(System.lineSeparator());
PrintStream/PrintWrite
python
try (
FileOutputStream fo = new FileOutputStream("./FileIOSample/file-output-4.txt");
PrintStream ps = new PrintStream(fo)){
ps.println(1);
ps.println("aa");
ps.println("AIUEO");
ps.println(new String("a ah"));
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
try (
FileOutputStream fo = new FileOutputStream("./FileIOSample/file-output-5.txt");
PrintWriter ps = new PrintWriter(fo)){
ps.println(1);
ps.println("aa");
ps.println("AIUEO");
ps.println(new String("a ah"));
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
file-output-4,5.txt
1
aa
AIUEO
aaa
Zusammenfassung:
StringReader,StringWriter
StringReader,StringWriter
String src = "AIUEO" + System.lineSeparator()
+ "abcde" + System.lineSeparator()
+ "3. Zeile";
+
try (StringReader sr = new StringReader(src)) {
char[] buff = new char[4];
int hasRead = 0;
while ((hasRead = sr.read(buff)) > 0) {
System.out.print(new String(buff, 0, hasRead));
}
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
try (StringWriter sr = new StringWriter()) {
sr.write("123");
sr.write("Ah");
System.out.println(sr.toString());
} catch (IOException e) {
e.printStackTrace();
}
Ausgabe
AIUEO
abcde
3. Zeile
123
InputStreamReader/OutputStreamWriter InputStreamReader / OutputStreamWriter konvertiert den Byte-Stream in einen Char-Stream.
InputStreamReader,BufferedReader
try (InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(reader)) {
String line;
System.out.print("input:");
while ((line = bufferedReader.readLine()) != null) {
if (line.equals("exit")) {
System.exit(0);
}
System.out.println("output:" + line);
System.out.print("input:");
}
} catch (IOException e) {
e.printStackTrace();
}
PushbackInputStream/PushbackReader
Ein Puffer für die Rückgabe wird vorbereitet und kann mit der folgenden Methode an den Puffer zurückgegeben werden. unread(int b) unread(byte[] | char[] buff) unread(byte[] | char[] buff, int off, int len)
push-back.txt
123456789
push-back-stream
int pushbackBuff = 8;
try (
PushbackReader pr = new PushbackReader(new FileReader("push-back.txt"), pushbackBuff)) {
int hasRead = 0;
int size = 1;
char[] buff = new char[size];
while ( (hasRead = pr.read(buff)) != -1) {
System.out.println(new String(buff, 0, hasRead));
// push back
pr.unread(buff, 0, hasRead);
buff = new char[++size];
}
} catch (IOException ex) {
System.out.println();
}
Ausgabe
1
12
123
1234
12345
123456
1234567
12345678
123456789
Bild verarbeiten
1
in Buff aus Datei1
in den Push-Back-Buff2
gibt Buff aus der Datei ein12
in den Push-Back-Buff12
zuerst den Buff vom Push-Back-Buff ein.3
gibt Buff aus der Datei einWiederholen Sie dies! !!
ObjectInputStream/ObjectOutputStream Ein Stream zum Serialisieren und Deserialisieren von Objekten. Zum Serialisieren muss Serializable / Externalizable implementiert werden.
Modell zu verwenden
import java.io.Serializable;
public class Person implements Serializable{
public String name;
public int age;
public Person(String name, int age) {
System.out.println("Create person.");
this.name = name;
this.age = age;
}
}
public class Student implements Serializable{
public String name;
public int age;
public Student(String name, int age) {
System.out.println("Create student.");
this.name = name;
this.age = age;
}
}
public class Teacher implements Serializable{
public String name;
public int age;
public Student student;
public Teacher(String name, int age, Student student) {
System.out.println("Create teacher.");
this.name = name;
this.age = age;
this.student = student;
}
}
Einzelobjekt in/out
System.out.println("------Serialisieren------");
try (
//Ausgabeziel(low level stream)
FileOutputStream fo = new FileOutputStream("object-out-1.data");
//Objektausgabegeschichte(high level stream)
ObjectOutputStream out = new ObjectOutputStream(fo)) {
//Objektausgabe
out.writeObject(new Person("alex", 30));
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
System.out.println("------Deserialisieren------");
try (
// (low level stream)
FileInputStream fi = new FileInputStream("object-out-1.data");
//Objektausgabegeschichte(high level stream)
ObjectInputStream in = new ObjectInputStream(fi)) {
Person p = (Person) in.readObject();
//Objektausgabe
System.out.println(p.name);
System.out.println(p.age);
} catch (IOException | ClassNotFoundException ex) {
System.out.println(ex.getMessage());
}
Ausgabe
#------Serialisieren------
Create person.
#------Deserialisieren------
alex
30
Zusammenfassung:
//Ernst machen
out.writeObject(new Person("alex", 30));
out.writeObject(new Student("king", 20));
//Desilia Größe
Person p = (Person) in.readObject();
Student s = (Student) in.readObject();
Zusammenfassung:
//Ernst machen
out.writeObject(new Teacher("alex", 30, new Student("king", 20)));
// writing aborted; java.io.NotSerializableException: io.serializable.Student
Teacher t = (Teacher) in.readObject();
Zusammenfassung:
python
Student s = new Student("king", 20);
//Ernst machen
out.writeObject(new Teacher("alex", 30, s));
out.writeObject(new Teacher("bill", 40, s));
//Desilia Größe
Teacher alex = (Teacher) in.readObject();
Teacher bill = (Teacher) in.readObject();
System.out.println(alex.student == bill.student); // true
Zusammenfassung: Selbst wenn dieselbe Referenz deserialisiert wird, wird wie vor der Serialisierung nur auf ein Objekt verwiesen. Bild serialisieren:
serialVersionUID Dies soll bestätigen, dass die Klassen zum Zeitpunkt der Serialisierung und Deserialisierung identisch sind. Wenn sich Vorder- und Rückseite unterscheiden, tritt "Ausnahme im Thread" main "java.io.InvalidClassException" auf.
Java repräsentiert den Standardein- und -ausgang in System.in und System.out mit Standardtastatur und -anzeige.
Standardausgangsumleitung
try (FileOutputStream fileOutputStream = new FileOutputStream("strandard-output.txt");
PrintStream print = new PrintStream(fileOutputStream)) {
System.setOut(print);
System.out.println("aaaaabbbbb");
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
NIO : https://qiita.com/liguofeng29/items/c827af3d62f219e17755 NIO2 : https://qiita.com/liguofeng29/items/3d0ba350a1547630727b
Recommended Posts