Prg2-09-File-IO - schmiedecke.info

Werbung
Programmieren2
09– File-IO
BachelorMedieninformatik
Sommersemester2016
Dipl.-Inform.IlseSchmiedecke
[email protected]
1
EingabeundAusgabeinJava
§ DatenimProgrammwährendderAusführungszeit:
Objekte
§ Ein- undAusgabeüberdieKonsole(TastaturundBildschirm)
System.inundSystem.out
§ Ein- undAusgabeüberGrafischeBenutzeroberflächen
(+Maus)
allesflüchtig,
nachProgrammende
verloren
2
2
Ein- undAusgabepersistenterDaten
§ ÜberdasBetriebssystemlässtsichjedesProgrammdazubringen,statt
derKonsoleDateienzubenutzen:
§ UmleitungdesEingabe- undAusgabestromsinderKommandozeile
sehreinfach:
echo eingabetext zum testen > input.txt
java console.StandardIO < input.txt > output.txt
§ SehrnützlichzumTesten!
§ MussaberbeijedenAufruf
§ konfiguriertwerden....
3
3
Datei-IOausdemProgrammheraus
§
§
§
§
§
DatenerreichenundverlasseneinProgrammserialisiert
Datenströme
DatenquellenundDatensenken(oder–ziele)
Eingabe- undAusgabeströme
StrömekönnendurchFiltermodifiziertwerden
Filter
Filter
Eingabe
strom
Ausgabe
strom
Datenquelle
Datensenke
4
4
Datenstrom-KlasseninJava
§ ImPaketjava.ioundjava.nio
§ InputStream undOutputStream sindabstrakteKlassen
zumLesen/SchreibenvonBytes(ASCII-Zeichen)
§ Konkretisierungensindz.B.FileInputStreamund FileOutputStream
§ Reader und Writer sindabstrakteKlassen
zumLesen/SchreibenvonUnicode-Zeichen(char)
§ InputStreamReader nimmteineBytestromundliestihnalsZeichenstrom
§ OutputStreamWriter nimmteinenZeichenstromundschreibtihnalsBytestrom
§ BufferedInputStream/Reader/OutputStream/Writer erlaubendaszeilenweise
LesenundSchreibenauseinem/ineinenentsprechendenStrom.
§ LineNumberReader isteinBufferedReader,derdiegelesenenZeilenum
Zeilennummernergänzt.
§ ...
5
5
ZusammenbauenvonDatenströmeninJava
§ Zeilenweise (Buffered)Zeichen lesen (Reader)
aus der Konsole (InputStream):
InputStream inSt = System.in;
Reader inRd = new InputStreamReader(inSt);
BufferedReader inBuf = new BufferedReader(inRd);
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
Buffered
Reader
Input
Stream
Reader
System.
in
6
6
ZusammenbauenvonDatenströmeninJava
§ Zeilenweise (Buffered)Zeichen schreiben(Writer)
ineine Textdatei (FileOutputStream):
FileOutputStream outFl = new FileOutputStream("myoutput.txt");
OutputStreamWriter outWr = new OuputStreamWriter(outFl);
BufferedWriter outBuf = new BufferedWriter(outWr);
BufferedWriter outBuf =
new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("myoutput.txt")));
Buffered
Writer
Output
Stream
Writer
File
Output
Stream
myoutput.
txt
7
7
ZusammenbauenvonDatenströmeninJava
§ Zeilenweise (Buffered)Zeichen schreiben(Writer)
ineine Zeichendatei(FileWriter):
FileWriter outWr = new FileWriter("myoutput.chr");
BufferedWriter outBuf = new BufferedWriter(outWr);
BufferedWriter outBuf =
new BufferedWriter(new FileWriter("myoutput.chr");
Buffered
Writer
File
Writer
myoutput.
chr
8
8
Komfortklassen
§ PrintStream undPrintWriter ermöglichendirektdas
zeilenweiseSchreibenundwerfenkeineExceptions.
§
PrintWriter writer = new PrintWriter
(new FileStream("x.dat");
writer.println("Dateianfang");
//Komfort-Konstruktor
§ System.out istvomTypPrintStream
§ Scanner (imPaketjava.util)erlaubtdirektdas
zeilenweiseLesenundwirftkeineExceptions.
Scanner read = new Scanner(System.in);
String s = read.nextLine();
9
9
FilterindenDatenströmen
§ Abstrakte Klassen FilterInputStream,FilterOutputStream,
FilterReader,FilterWriter
§ Eigene Implementierungen können indenDatenstrom
"eingehängt"werden,z.B.Löschen vonSteuerzeichen
FileWriter outWr = new FileWriter("myoutput.chr");
MyFilterWriter outFilt = new MyFilterWriter(outWr);
MyFilterWriter outFilt =
new MyFilterWriter(new FileWriter("myoutput.chr");
MyFilter
Writer
File
Writer
myoutput.
chr
10
10
EinenFilterselbstschreiben:
§ FiltersollGroß-gegen
Kleinbuchstaben
tauschenund
umgekehrt:
§ FilterWritererweitern
§ abstrakteKlasse
enthältBasisImplementierungfür
alleWriter-Methoden
§ write-Methoden
überschreiben
§ RückgriffaufBasisImplementierung
(super)inKonstruktor,
fürNicht-Buchstaben
undzumSchließen
11
11
Filteranwenden
12
12
Textdateien
§ AllebisherigenStrömearbeitenaufderBasisvonZeichen
§ Dateiensindlesbar
§ EinfachsteStruktur:Zeile
EinDatenwertproZeile
§ FürkompliziertereDatenstrukturenbrauchtman
Protokolle:VereinbarungenzwischenderSchreib- undder
Leseeinheit
§ Beispiel:SchreibenundLesenvonFilmen
§ CSV– eineüblicheFormder2-stufigenStruktur(Tabelle)
13
13
AnwendungsbeispielCSV-Ausgabe
§ DannineinerSchleifefüralleMovies
§ AusdemMovie-ObjekteinenCSV-Stringmachen
"createStringFromMovie(...)"
§ AlsZeileindieDateischreiben
§ IO-Exceptions beachten!
§ ZumSchlussDateischließen!
14
14
AnwendungsbeispielCSV-Eingabe
§ DannineinerSchleifezeilenweiselesenund:
§ ausderZeileeinMovie-Objektbauen
"createMovieFromString(...)"
§ dasMovie-ObjektderListehinzufügen
§ IO-Exceptions beachten!
§ ZumSchlussDateischließen!
§ außerhalbderMethodeevtl:
§ ListeneinträgeineinMovieRegister schreiben.
15
15
ProtokollMovieà CSV
§ Achtung:
§ DieReihenfolgederCSV-Einträgeistwichtig!
§ MüsseninderselbenReihenfolgewiedergelesenwerden!
16
16
Protokoll:CSVà Movie("Parsen")
17
17
Testen....
18
18
Protokolle
§ Protokoll:
VereinbarungüberFormatundReihenfolgederDaten
§ Hier:CSV,getrenntdurch":"
§ Schreib- undLeseStromsolltenaneinanderangepasstsein
§ Lese-Schreib-Paar:
Prog1
CSV
Writer
File
CSV
Reader
Prog2
Strom-Paar
19
19
SichereProtokoll-Klasse
ç√
ç√
§ FilenameundSplitterwerdenimKonstruktorgesetzt
§ readMovieFile undwriteMovieFile nichtmehrstatic
20
20
LesenundSchreibenmitderselbenKlasse
21
21
AndereStandard-Datenformate/Protokolle
§ CSVgutgeeignetfür"Datensätze"
§ ZeileninExcel- oderDatenbanktabellen
§ Standard-ExportformatfürExcelundRelationaleDB
§ XMLoptimalfürhierarchischeDaten
§ KnotenmitNamenundEigenschaftenbelegbar
§ DokumentenformatebenfallsinXMLbeschreibbar
§ fertigeParserundandereWerkzeuge
§ JSON(Javascript Object Notation)fürhierarchischeDaten
§ Name– Wert– Paare,WertekönnenMengenoderListensein
§ kompakteralsXML
§ fertigeParserundandereWerkzeuge
22
22
JSON
§ Liste von Name-Wert-Paaren
§ Wert kann wieder Liste sein
§ Listenformen:
§ JSONArray (sortiert) [ ]-geklammert
§ JSONObject (unsortiert) { }-geklammert
§ Datentypen: String, Number, Boolean, null
§ Whitespace ist bedeutungslos
{ "title":"Casablanca",
"germanTitle":"Casablanca",
"genre":"Drama",
"year":1962,
"actors":["Humphrey Bogart", "Ingrid Bergmann"],
"fsk"
:
12
}
23
23
VerarbeitunginJava
§ Bibliotheken
§ sehreinfachzubenutzen:JSON-simple vonGoogle
https://code.google.com/archive/p/json-simple/
§ jar-DateiherunterladenundalsexterneBibliothekeinbinden
§ schnelleersteSchritte:
http://www.tutorialspoint.com/json/json_java_example.htm
24
24
JSON-ProtokolldateifürMoviesverwenden
§ AnwendungwieCSV,hierabergleichfürsganzeRegister:
§ Registerschreiben"writeMovieRegister(...)"
§ Registerlesen"readMovieRegister(...)
25
25
JSONObject erzeugen/lesen
...
Reihenfolge ist
egal!
26
26
DieLese- undSchreibmethoden
§ writeMovieRegister(MovieRegister register)
§ MovieRegister readMovieRegister()
§ eröffnenundschließendieDatei
§ benutzendieMethodenencodeMovie /decodeMovie in
einerSchleife
§ dieCodierungläuftvonMovienachJSONObject und
umgekehrt
§ EinParser erzeugteinJSONObject oderJSONArray aus
einemString
§ DieUmwandlungvonJSONObject oderJSONArray nach
StringmachtdieMethodewriteJSONString
27
27
writeJSONString vonJSONObject /JSONArray nachString
Zusammenfassung
allerMovieszu
einemJSONArray
28
28
JSONParser vonStringnachJSONObject /JSONArray
29
29
...daswars mitJSON
30
30
SoweitzuTextdateien
J
NächstesMalgibtesBinäres....
Esfolgennocheinpaar
Kniffs fürInteressierte....
31
31
FormatierteTextausgabe
§ PrintStreamundPrintWriterhabeneineMethodezurformatiertenAusgabe
§ FormatierungbedeutetauchKonvertierungvonDaten:Zeit,Zahlensysteme,
Rundung,etc
§ voidprintf (Stringformat,Object...args);//oderformat
§ format:BeschreibungdesFormatsalsString:
System.out.printf( "%X %3$s %2$d", 31,
31, " hexa ist ");
Ausgabe:1Fhexaist31
§ DieParametersindindiziert1..n,derIndexkannangegebenwerden(%3$
stehtfürden3.Parameter)
§ X,d,ssindSteuerzeichen(fürhexadezimalmitGroßbuchst.,dezimal,String)
§ DieSteuerzeichenfürdieDarstellungundKonvertierungfindetmanunter
java.util.Formatter
32
32
WichtigeFormat-Steuerzeichen
§ Zahlen,ZeichenStrings:
§ d,o,x,X
§
§
§
§
§
f,e,E,a,A
g,G
s,S
c
n
GanzzahlinDezimal-,Oktal-,Hexadezimalund
wiss.Darstellung(mitKlein- oderGroßbuchstaben)
GleitpunktzahlinDezimal-,wiss.oderHexa-Darstellung
wieeoderfnach"Bedarf"
ObjektalsStringmittelstoString– odernull
Unicode-Zeichen
\n– plattformspez.Zeilentrenner
§ FormatierungvonNachkommastellen
§ Klassejava.text.DecimalFormat:AngabevonStellenundDezimalzeichen
§ FormatstringoptinalfürpositiveundnegativeWertdurch";"getrennt
§
§
§
§
§
new DecimalFormat("#.0000") // vierNachkommastellen
new DecimalFormat("Haben #,##0.00;Soll #,##0.00") // Untersch.posu.neg
String num = new DecimalFormat("#0.00").format(1.434E2);
System.out.println(num);
System.out.printf("%n %s", num);
33
33
WichtigeFormat-Steuerzeichen
§ Zeit:
§
§
§
§
t,T
H,M,S
k
L
§ Datum
§
§
§
§
§
§
§
§
B,A
b,a
Y,y
m,d
e
R
T
c
leitetZeitkonvertierungein
Stunde,Minute,Sekunde2-stellig(24h)
Stunde1-2-stellig(0..23)
Millisekunde3-stellig
vollerMonats- bzw.Tagesname("Januar")
abgekürtzerMonats- bzw.Tagesname("Jan")
Jahr4- bzw.2-stellig
Monat,Tag2-stellig
Monat1-2-stellig(1-31)
StundeundMinuteim24h-Format("%tH:%tM")
Stunde,Minute,Sekundeim24h-Format
Standard-Format("FrJan1614:25:08MEZ2015")
34
34
ArbeitenimDateisystem
KlassenfürPfadeundDateienbietetdasPaketjava.nio
§ ErzeugeneinesPath-Objekts- KlassenPathundPaths:
Path path = Paths.get("C:\\temp\\java_test_input.txt");
§ Im Pfadbaum aufsteigen
Path dir = path.getParent();
§ Umwandeln inURI
URI uri = path.toURI();
§ Kopieren,Erzeugen Löschen - Klasse Files:
copy (Path source, Path target, CopyOption… opt)
move (Path source, Path target, CopyOption… opt)
ceateDirectory(Path dir, FileAttribute<?>… attr)
createFile(Path dir, FileAttribute<?>… attr)
delete(Path path)
§ IO-Ströme zu Pfaden
new BufferedReader(Path path, Charset cs)
new BufferedWriter(Path path, Charset cs, OpenOption... opt)
new InputStream(Path path, Charset cs, OpenOption... opt)
new OutputStream(Path path, Charset cs, OpenOption... opt)
List<String> fileContent = readAllLines(Path path, Charset cs);
35
35
Herunterladen