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.28
Hier 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);