Aus einer Binärdatei, die mit der Klasse java.io.DataOutputStream erstellt wurde, sollten die Daten einer Versandhausbestellung wieder ausgelesen und in geeignet formatierter Form zusammen mit dem errechneten Gesamtwert der Bestellung als Rechnung ausgegeben werden. Die Daten der Bestellung bestehen aus einer Folge von Artikel-Daten, wobei ein Artikel durch vier Größen beschrieben wird:
import java.io.*; public class Einlesen { public static void main(String [] args) { FileInputStream dis=null; // arbeitet auf dem Eingabefile DataInputStream in=null; // arbeitet auf dem Eingabestrom aus dem Eingabefile long bestnummer; String artikel; float preis; int anzahl; float kosten=0; // summiert Gesamtkosten double r_kosten; // gerundete Kosten String zwischen,zeile=""; // fuer die schoene Formatierung if (args.length!=1) // Kontrolle, ob die Eingabedatei mit angegeben wurde { System.out.println("Bitte die Eingabedatei in der Kommandozeile mit eingeben !"); System.exit(1); } try { dis= new FileInputStream(args[0]); // Fehlersicheres oeffnen der beiden Stroeme in=new DataInputStream(dis); // dabei muss die Eingabedatei als Parameter da sein } catch (FileNotFoundException e) // faengt Fehler, falls Eingabefile nicht existiert { System.out.println("Existiert das file : "+args[0]+" ueberhaupt ?"); System.exit(1); } System.out.println("Rechnung :\n"); System.out.println("Bestellnummer Artikelbezeichnung Preis Stueck"); System.out.println("============= ============================= ===== ======\n"); try { for (;;) // ewige Schleife : unbekannte file-Groesse // also Abbruch mit Exception { zeile=""; bestnummer=in.readLong(); // Bestellnummer einlesen zwischen=java.lang.Long.toString(bestnummer); // in einen String verwandeln for (int i=0;i<(12-zwischen.length());i++) // fuer Layout : rechtsbuendig in die // dafuer vorgesehene Spalte zeile+=" "; zeile+=zwischen; // und in String zeile geben artikel=in.readUTF(); // dasselbe Vorgehen wie bei bestnummer zwischen=artikel.toString(); zeile+=" "+zwischen; for (int i=0;i<30-zwischen.length();i++) zeile+=" "; preis=in.readFloat(); // dasselber Vorgehen wie bei bestnummer zwischen=java.lang.Float.toString(preis); anzahl=new Float(preis).intValue(); // bis auf hier : damit die Dezimalpunkte // buendig sind, muss Vorkommateil // betrachtet werden ! zwischen=java.lang.Integer.toString(anzahl); for (int i=0;i<5-zwischen.length();i++) // Vorspann an Spaces mittels Vorkommateil ! zeile+=" "; zeile+=java.lang.Float.toString(preis); if (java.lang.Float.toString(preis).length()==java.lang.Integer.toString(anzahl).length()+2) zeile+=" "; // wenn nur eine Nachkommastelle => + " " zeile+=" "; anzahl=in.readInt(); // dasselbe Vorgehen wie bei bestnummer kosten+=preis*anzahl; zwischen=""; zwischen=java.lang.Integer.toString(anzahl); for (int i=0;i<5-zwischen.length();i++) zeile+=" "; zeile+=zwischen; System.out.println(zeile); // und fertig formatierte Zeile ausgeben } } catch (IOException e) { } // faengt die Fehlerquelle "file zuende" auf zeile=" Gesamtkosten : "; r_kosten=Math.round(kosten*100)/100.0; // Runden auf Pfennige zwischen=java.lang.Double.toString(r_kosten); for (int i=0; i<5-java.lang.Integer.toString(new java.lang.Double(kosten).intValue()).length(); i++) // hier wird ein neues Float Object mit dem // Gesamtpreis initialisiert, dann der // Vorkommateil benutzt, um mittels des // Integer-Objektes die Laenge der // Stringdarstellung des Vorkommateils zu // ermitteln. So wird der Dezimalpunkt // buendig ! zeile+=" "; zeile+=zwischen; System.out.println(zeile); try { dis.close(); // fehlersicheres Schliessen des files } catch (IOException e) { } } }Man erhät damit die folgende Ausgabe:
Rechnung : Bestellnummer Artikelbezeichnung Preis Stueck ============= ============================= ===== ====== 123454444 Digital Thermometer 15.98 1 123456543 Eiskratzer 2.99 2 123454420 Türschloss-Enteiser 3.59 5 5134336 Glühwein 4.59 3 7227434 Handschuhe 42.5 1 7227435 Schal, Wolle 22.1 1 Gesamtkosten : 118.28Hier das Programm zum mitnehmen: Sourcecode
Vorgegeben war der unkommentierte Source-Code eines Applets zu dem 10 Fragen beanwortet werden sollten.
ImagemapRectangle r = (ImagemapRectangle) rects.elementAt(i);