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