• Keine Ergebnisse gefunden

Ein- und Ausgabe

N/A
N/A
Protected

Academic year: 2021

Aktie "Ein- und Ausgabe"

Copied!
41
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Ein- und Ausgabe

Für die Ein- und Ausgabe von Daten gibt es eine Reihe von Möglichkeiten. Beispiele hierfür sind:

• Eingabe als Parameter auf der Kommandozeile

• Eingabe über die Tastatur

• Eingabe aus einer oder mehreren Dateien

• Eingabe über GUI-Widgets Im Prinzip auch möglich:

• Eingabe im Programmtext

Dies ist aber nur sinnvoll, wenn es wenige Eingaben gibt.

(2)

Ein- und Ausgabe

• Ausgabe auf dem Bildschirm

• Ausgabe in eine oder mehrere Dateien

• Ausgabe über GUI-Widgets

Einige dieser Möglichkeiten für die Ein- und Ausgabe haben wir bereits besprochen. In diesem Kapitel wiederholen wir einige Konzepte und sehen uns weitere Beispiele an.

Es gibt noch weitere Möglichkeiten. Zum Beispiel können Daten durch die Kommunikation zwischen Prozessen erhalten oder weitergeleitet werden.

Die Programmierung von parallelen Prozessen und grafischen Oberflächen behandeln wir in Programmieren II.

(3)

Ein-/Ausgabe

• Einige Klassen und Methoden zur Ein-/Ausgabe haben wir ja schon kennengelernt.

• In diesem Kapitel wiederholen wir einige dieser Klassen und Methoden und sehen uns nur einige weitere Klassen und Methoden für die Ein- und Ausgabe an.

• Java bietet sehr viele weitere Klassen und Methoden für die Ein- und Ausgabe von Daten an.

(4)

Grundlagen

• Der Zugriff auf Daten kann wahlfrei oder sequenziell erfolgen. Für den sequenziellen Zugriff wurde in Java das Konzept der Streams eingeführt.

• Ein Stream ist ein abstraktes Konzept, das Zeichen der Reihe nach von einem imaginären Eingabegerät lesen oder auf ein imaginäres Ausgabegerät schreiben kann. Java 8: interface Stream<T>.

• Erst konkrete Unterklassen binden die Zugriffsroutinen an echte Ein- und Ausgabe wie

◦ Tastatur oder Bildschirm,

◦ Dateien,

◦ Strings und

◦ Kommunikationskanäle, ....

(5)

Streams

• Streams können verkettet oder verschachtelt werden.

• Durch die Verkettung von Streams ist es möglich, mehrere Streams zu einem zusammenzufassen, der die Streams nacheinander verarbeitet.

• Die Schachtelung von Streams erlaubt z. B. die Konstruktion von Filtern, die beispielsweise Zeichen puffern oder Eingabezeilen zählen.

• Beide Konzepte sind durch Klassen realisiert und können daher vom Benutzer modifiziert und erweitert werden.

• Klassen zur Ein- und Ausgabe befinden sich zum Beispiel in den Paketen java.io und java.util (Nicht alle).

(6)

Streams

• Byte-Streams

Jede Transporteinheit ist 8 Bit lang.

• Character-Streams

Character-Streams verwenden Unicode-Zeichen der Länge 16 Bit.

• Für die Umwandlung beider Stream-Arten ineinander wurden Brückenklassen eingeführt. Beispiele: OutputStreamWriter, InputStreamWriter.

(7)

Zugriff auf Dateien

Wenn wir die Daten einer Datei bearbeiten wollen, so müssen wir

• die Datei öffnen,

• die Datenelemente lesen und verarbeiten bzw. die Elemente in der gewünschten Reihenfolge ausgeben und

• die Datei wieder schließen.

Gegebenenfalls muss die Datei vorher erzeugt werden.

(8)

Ein- und Ausgabe

• In Java existieren eine Vielzahl von Klassen und Methoden zum wahlfreien und sequenziellen Zugriff auf Dateien und andere Ein- oder Ausgabemedien.

• Wir können hier nur eine kleine Auswahl von ihnen näher betrachten und diese exemplarisch an typischen Beispielen erläutern.

• Für weitere Informationen sollten Sie die angegebene Literatur zu Rate ziehen.

(9)

Stream-Basisklassen

Die folgenden abstrakten Klassen bilden die Basis für die streambasierte Ein-Ausgabe:

Byte Ausgabe OutputStream

Byte Eingabe InputStream

Character Ausgabe Writer Character Eingabe Reader

Viele der Unterklassen existieren sowohl für "Byte" als auch für "Character".

(10)

Stream-Basisklassen

Stream-Klassen sind hierarchisch organisiert:

• Writer (abstract)

◦ BufferedWriter

◦ OutputStreamWriter

∗ FileWriter

• Reader (abstract)

◦ BufferedReader

◦ InputStreamReader

∗ FileReader

(11)

Die Klasse PrintStream

Die Klasse PrintStream bietet Methoden zum Schreiben der Werte vieler Datentypen:

class PrintStream { ...

print( ... );

println( ... );

printf( ... );

...

}

Einige Anwendungen kennen wir schon lange:

System.out.println(...)

java.lang.System.out.println(...)

(12)

Die Klasse PrintStream

Ableitungshierarchie der Klasse PrintStream:

• Object

◦ OutputStream (abstract)

∗ FilterOutputStream - PrintStream

(13)

Die Klasse System

• Die Klasse System enthält eine Reihe systemnaher Attribute und Methoden. Sie kann nicht instanziiert werden.

• Attribute: PrintStream out, InputStream in und PrintStream err

• Methoden (Auswahl):

◦ static void exit(int status)

Ein Aufruf dieser Methode beendet den gegenwärtigen Lauf der Java Virtual Machine. Das Argument dient als Status-Code. Gemäß Vereinbarung bedeutet ein von 0 verschiedener Wert einen Fehler.

◦ static Properties getProperties()

static String getProperty(string key)

(14)

Die Klasse System

class System {

// Der Standard-Ausgabe-Stream; eine Klassenvariable public static final PrintStream out;

// Der Standard-Eingabe-Stream; eine Klassenvariable public static final InputStream in;

// Der Standard-Fehler-Stream; eine Klassenvariable public static final PrintStream err;

...

}

(15)

Die Klasse System

Systembedingte Eigenschaften werden durch die Properties der Klasse System zur Verfügung gestellt.

static String getProperty(string key);

String ls = System.getProperty("line.separator");

Einige Eigenschaften: s. nächste Folie.

(16)

Properties der Klasse System

Version: java.version

Firma: java.vendor

Home: java.home

Betriebssystem: os.name Architektur: os.arch

Version: os.version

Benutzername: user.name Home-Verzeichnis: user.home Verzeichnis: user.dir

Zeilentrennzeichen: line.separator Dateitrennzeichen: file.separator Pfadtrennzeichen: path.separator

(17)

Properties der Klasse System

Das folgende Beispiel gibt die Java-Version und die Firma aus:

class Test {

public static void main(String[] args) {

String s = System.getProperty("java.version");

System.out.println(s);

s = System.getProperty("java.vendor");

System.out.println(s);

} }

(18)

Ausgabe auf Datei

String ls = System.getProperty("line.separator");

String hello = "Hallo Java!";

FileWriter f1;

try {

f1 = new FileWriter("hallo.txt");

f1.write(hello + ls + hello + ls);

f1.close();

}

catch (IOException e) {

System.out.println("Fehler beim Erstellen der Datei!");

}

(19)

Eingabe von der Tastatur

import java.io.*;

... throws IOException { int a, b, c;

BufferedReader din = new BufferedReader(

new InputStreamReader(System.in));

System.out.println("Bitte a eingeben: ");

a = Integer.parseInt(din.readLine());

System.out.println("Bitte b eingeben: ");

b = Integer.parseInt(din.readLine());

c = a + b;

System.out.println("a + b = " + c);

}

(20)

Puffern der Ein- bzw. Ausgabe

• Das Puffern der Ein- bzw. Ausgabe verringert i. Allg. die Anzahl der externen Zugriffe und erhöht somit die Effizienz.

• Die Methode readLine() der Klasse BufferedReader liest eine ganze Zeile.

(21)

Lesen aus einer Datei

FileReader f;

int c;

try {

f = new FileReader("...");

while ((c = f.read()) != -1) { System.out.print((char) c);

}

f.close();

}

catch (IOException e) {

System.out.println("Fehler beim Lesen der Datei!");

}

(22)

Die Klasse File

• Im Paket java.io existiert die Klasse File.

• Objekte dieser Klasse repräsentieren Dateien oder Verzeichnisse.

• Konstruktoren:

◦ File(String pathname)

◦ File(String parent, String child)

◦ File(File parent, String child)

• Beispiele:

◦ new File("Test.java")

◦ new File("..", "Test.java")

(23)

Anlegen und Löschen einer Datei

• Das Anlegen einer Datei besteht aus zwei Schritten:

1. Überprüfen, ob die Datei bereits existiert.

2. Falls nein, Datei anlegen.

Wenn mehrere Prozesse parallel arbeiten, dann müssen diese Schritte als Transaktion ablaufen.

• boolean createNewFile() throws IOException

• void deleteOnExit()

(24)

Zugriff auf den Pfadnamen

• String getName()

• String getPath()

• String getAbsolutePath()

• String getParent()

(25)

Informationen über eine Datei

• boolean exists()

• boolean isFile()

boolean isDirectory()

• boolean canWrite() boolean canRead()

• String[] list()

• File[] listFiles()

File[] listFiles(FileFilter filter)

FileFilter ist eine Schnittstelle. Es ist die Methode boolean accept(File pathname) zu implementieren.

(26)

Ändern von Verzeichniseinträgen

• boolean mkdir()

• boolean mkdirs()

Creates the directory named by this abstract pathname, including any necessary but nonexistent parent directories.

• boolean renameTo(File dest)

• boolean delete()

(27)

Rekursiver Durchlauf eines Verzeichnisses

import java.io.*;

public interface DirectoryVisitor {

public void enterDirectory(File dir);

public void leaveDirectory(File dir);

public void visitFile(File file);

}

(28)

Rekursiver Durchlauf eines Verzeichnisses

import java.io.*;

public class DirectoryPrintVisitor implements DirectoryVisitor { String indent = "";

public void enterDirectory(File dir) {

System.out.println(indent + "[" + dir.getName() + "]");

indent += " ";

}

public void leaveDirectory(File dir) { indent = indent.substring(2);

}

public void visitFile(File file) {

System.out.println(indent + file.getName());

} }

(29)

Rekursiver Durchlauf eines Verzeichnisses

static void traverse(File dir, DirectoryVisitor visitor) { visitor.enterDirectory(dir);

File[] entries = dir.listFiles()

for (int i = 0; i < entries.length; ++i) { if (entries[i].isDirectory()) {

traverse(entries[i], visitor);

} else {

visitor.visitFile(entries[i]);

} }

visitor.leaveDirectory(dir);

}

(30)

Rekursiver Durchlauf eines Verzeichnisses

Listing des Ordners tmp im Home-Verzeichnis:

String fs = System.getProperty("file.separator"),

file = System.getProperty("user.home") + fs + "tmp";

traverse(new File(file), new DirectoryPrintVisitor());

(31)

Formatierte Ausgabe

for (double x = 0.5; x<=1.4; x+=0.1) {

System.out.println(x+": "+Math.sin(x));

}

0.5: 0.479425538604203 0.6: 0.5646424733950354 0.7: 0.644217687237691

0.7999999999999999: 0.7173560908995227 0.8999999999999999: 0.7833269096274833 0.9999999999999999: 0.8414709848078964 1.0999999999999999: 0.8912073600614353 1.2: 0.9320390859672263

1.3: 0.963558185417193

(32)

Formatierte Ausgabe

for (double x = 0.5; x<=1.4; x+=0.1) {

System.out.printf("%4.2f: %9.6f%n", x, Math.sin(x));

}

0.50: 0.479426 0.60: 0.564642 0.70: 0.644218 0.80: 0.717356 0.90: 0.783327 1.00: 0.841471 1.10: 0.891207 1.20: 0.932039 1.30: 0.963558

(33)

Formatierte Ausgabe

• Die Methode printf ermöglicht eine formatierte Ausgabe.

• %4.2f, %9.6f und %n sind Formatstrings. Formatstrings beginnen mit % und enden mit einem Konversionszeichen, zum Beispiel f.

• Zwischen dem Prozentzeichen und dem Konversionszeichen können weitere

Steuerzeichen stehen, die die Formatierung steuern. Beispielsweise bedeutet 9.6, dass die Ausgabe mindestens 9 Zeichen lang ist und 6 Nachkommastellen besitzt.

• Durch weitere Angaben kann beispielsweise festgelegt werden, ob die Ausgabe links- oder rechtsbündig erfolgt, ob führende Nullen ausgegeben werden oder ob positive Vorzeichen dargestellt werden.

(34)

Formatstring

%b boolescher Wert

%c Zeichen

%d ganzzahliger Wert in Dezimaldarstellung

%o ganzzahliger Wert in Oktaldarstellung

%x ganzzahliger Wert in Hexadezimaldarstellung (Kleinbuchstaben)

%X ganzzahliger Wert in Hexadezimaldarstellung (Großbuchstaben)

%f Fließkommazahl

%e Fließkommazahl, Exponentenschreibweise

%g Fließkommazahl, gemischte Schreibweise

%s Strings, Objekte

%n neue Zeile

%% das Prozentzeichen . . . .

(35)

Steuerzeichen

- linksbündige Ausgabe

+ immer mit Vorzeichen ausgeben 0 führende Nullen ausgeben

, Zahlen mit Tausendermarkierung ausgeben

( negative Zahlen in Klammern ausgeben, kein Vorzeichen m Mindestbreite

.p bei %g die Anzahl der Nachkommastellen Beispiele:

%9.6f Fließkommazahl mit mindestens 9 Stellen, davon 6 Nachkommastellen

%+05d ganzzahliger Wert in Dezimaldarstellung, mindestens 5 Stellen, führende Nullen und Vorzeichen werden ausgegeben

(36)

Formatierte Ausgabe

• Die Methode

PrintStream printf(String format, Object... args) gehört zur Klasse PrintStream.

• Die Methode

static String format(String format, Object... args) gehört zur Klasse String.

• Einzelheiten zur formatierten Ausgabe können in der Beschreibung der Klasse java.util.Formatter

nachgelesen werden.

(37)

Die Klasse Scanner

• Die Klasse Scanner stellt einen einfachen Text-Scanner zur Verfügung, mit dessen Hilfe primitive Datentypen und Strings analysiert werden können.

• Diese Klasse befindet sich im Paket java.util:

import java.util.Scanner

• Wir erläutern die Anwendung dieser Klasse an drei Beispielen:

1. Eingabe von der Tastatur,

2. Eingabe durch eine Zeichenkette, 3. Eingabe aus einer Datei.

• Weitere Einzelheiten, insbesondere die Verwendung regulärer Ausdrücke als Trennzeichen, können der Java-Dokumentation entnommen werden.

(38)

Die Klasse Scanner

Eingabe von der Tastatur:

Scanner sc = new Scanner(System.in);

int i, j;

System.out.print("Bitte geben Sie die erste Zahl ein: ");

i = sc.nextInt();

System.out.print("Bitte geben Sie die zweite Zahl ein: ");

j = sc.nextInt();

System.out.printf("Die Summe der Zahlen beträgt %d.%n", i+j);

(39)

Die Klasse Scanner

Eingabe durch eine Zeichenkette:

int i, j;

Scanner sc = new Scanner("34 45");

i = sc.nextInt();

j = sc.nextInt();

System.out.printf("Die Summe der Zahlen beträgt %d.%n", i+j);

(40)

Die Klasse Scanner

Eingabe aus einer Datei:

public static void main(String[] args) throws IOException { Scanner sc = new Scanner(new File("zahlen.txt"));

double k = 0.0;

while (sc.hasNextDouble()) { k += sc.nextDouble();

}

System.out.printf("Die Summe der Zahlen beträgt %.4f.%n", k);

}

(41)

Ein-/Ausgabe

Wie schon erwähnt:

Java bietet sehr viele weitere Klassen und Methoden für die Ein- und Ausgabe von Daten an.

Beispiel: Sehen Sie sich die Beschreibung der Klassen

• Console,

• Path,

• Paths und

• Files

in der Java-Api an.

Referenzen

ÄHNLICHE DOKUMENTE

Schreiben Sie ein Java-Programm, das eine beliebige Anzahl von double –Werten einliest und so in ein Feld abspeichert, dass gleiche Werte hintereinander angeordnet sind und

(z.B. Quadrat) Lage, Position, Größe, Strichstärke, Strichfarbe, Füllfarbe, Füllmuster,

Wenn in einer &#34;Klasse&#34; KEINE Methode implementiert ist, wird sie als interface &#34;Schnittstelle&#34; bezeichnet. public interface

Beim Kopieren kann die obere Formulierung eine Liste von Studenten (elementweise) in eine Liste von Lebewe- sen kopieren, die untere kann nur eine Liste von Perso- nen in eine Liste

Wenn Klassen, die als Oberklassen verwendet werden, neue Unterklassen bekommen, erhalten deren virtuelle Klassen eben- falls neue Oberklassen.

Beim Kopieren kann die obere Formulierung eine Liste von Studenten (elementweise) in eine Liste von Lebewe- sen kopieren, die untere kann nur eine Liste von Perso- nen in eine Liste

Beim Beenden des Servers getServletInfo Liefert Info zu Servlet. Methoden

 Während der Ausführung einer Methode kann ein Objekt auch Methoden bei (anderen) Objekten aufrufen..