You are not logged in.

  • Login

1

Wednesday, June 7th 2006, 7:47pm

Java Streams: Dateioperationen

Die Java Utilities Scanner und Formatter sind zweifellos sehr komfortabel.
In dieser Übung lernt ihr Streams kennen und könnt euch von deren Performance überzeugen.

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import java.io.*;
import java.util.*;
 
/**
 * @author Torben Brodt
 * @version 1.0
 *
 * <p />Performance Vergleich zwischen Streams und den Scanner/Formatter Utilities
 * <p />Funktioniert ab Java 1.5 
 */
public class A07_Randoms {
	// Globale Variablen fuer Sprachdateien und zur Konfiguration
	final static int max=100000;
	final static String writeSuccess = "Es wurden "+max+" Zufallszahlen in %s geschrieben\n\n";
	final static String middle = "Das arithmetische Mittel lautet: %d\n\n";
 
	/**
	 * MAIN Funktion ruft das Abfragemenue auf
	 * @param args -> keine Parameter
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		menu(0);
	}
 
	/**
	 * Schnelles Verfahren zum Datei einlesen
	 * @param filename Dateiname
	 * @throws IOException
	 */
	static void readStream(String filename) throws IOException {
		double mitte=0;
		DataInputStream input = new DataInputStream(
				new BufferedInputStream(
				new FileInputStream(filename)));
		for(int i=0; i<max; i++) 
			mitte += input.readDouble();
		input.close();
		System.out.printf(middle, mitte/max);
	}
 
	/**
	 * Schnelles Verfahren zum Datei auslesen
	 * @param filename Dateiname
	 * @throws IOException
	 */
	static void writeStream(String filename) throws IOException {
		DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(filename)));
		for(int i=0; i<max; i++) 
			output.writeInt((Math.random()*100));
		output.close();
		System.out.printf(writeSuccess, filename);
	}
 
	/**
	 * Einfaches Verfahren zum Datei schreiben
	 * @param filename Dateiname
	 * @throws FileNotFoundException
	 */
	static void writeFormatter(String filename) throws FileNotFoundException {
		Formatter output = new Formatter(new File(filename));
		for(int i=0; i<max; i++)
				output.format((Math.random()*100) + "\n");
		output.close();
		System.out.printf(writeSuccess, filename);
	}	
 
	/**
	 * Einfaches Verfahren zum Datei auslesen
	 * @param filename Dateiname
	 * @throws FileNotFoundException
	 */
	static void readScanner(String filename) throws FileNotFoundException {
		double mitte=0;
		Scanner input = new Scanner(new File(filename));
		while(input.hasNextLine())
			mitte += Integer.parseInt(input.nextLine());
		input.close();
		System.out.printf(middle, mitte/max);
	}
 
	/**
	 * Menue (kann sich auch selbst aufrufen)
	 * @param eingabe Tastatureingabe als Integer
	 * @throws IOException
	 */
	static void menu(int eingabe) throws IOException {
		switch(eingabe) {
		case 0: //Hauptmenue
			menu(ask("Bitte waehlen Sie:\n" +
					"1: Zahlen erzeugen und in Datei schreiben\n" +
					"2: Zahlen aus Datei einlesen und arithmetische Mittel berechnen\n" +
					"3: Programm beenden"));
			break;
		case 1: //1. Navigationsebene Schreibe
			menu(ask("Bitte waehlen Sie:\n" +
					"1: Mittels Formatter\n" +
					"2: Mittels Streams")+10);
			break;
		case 2: //1. Navigationsebene Lese
			menu(ask("Bitte waehlen Sie:\n" +
					"1: Mittels Scanner\n" +
					"2: Mittels Streams")+20);
			break;
		case 3: //1. Navigationsebene Beenden
			System.out.println("Auf Wiedersehen");
			System.exit(0);
			break;
		case 11: //Zahlen erzeugen und in Datei schreiben
			writeFormatter(askFilename());
			break;
		case 12: //Zahlen erzeugen und in Datei schreiben
			writeStream(askFilename());
			break;
		case 21: //Zahlen aus Datei einlesen und arithmetische Mittel berechnen
			readScanner(askFilename());
			break;
		case 22: //Zahlen aus Datei einlesen und arithmetische Mittel berechnen
			readStream(askFilename());
			break;
		default:
			System.out.println("Fehler in der Eingabe. Bitte erneu versuchen.");
		}
		if(eingabe > 3)
			menu(0);
	}
 
	/**
	 * Gibt eine Frage aus und liest einen Integerwert von Tastatur ein und liefert ihn zurueck
	 * @param question Die Frage
	 * @return Die Eingabe
	 */
	static int ask(String question) {
		System.out.println(question);
		java.util.Scanner input = new java.util.Scanner(System.in);
		return input.nextInt();
	}
 
	/**
	 * Fragt nach dem Dateinamen und gibt diesen zurueck 
	 * @return die Eingabe
	 */
	static String askFilename() {
		System.out.println("Bitte geben Sie einen Dateinamen ein:");
		java.util.Scanner input = new java.util.Scanner(System.in);
		return input.next();
	}
}


Programmablauf:

Quoted

Bitte waehlen Sie:
1: Zahlen erzeugen und in Datei schreiben
2: Zahlen aus Datei einlesen und arithmetische Mittel berechnen
3: Programm beenden
1
Bitte waehlen Sie:
1: Mittels Formatter
2: Mittels Streams
2
Bitte geben Sie einen Dateinamen ein:
zahlen.dat
Es wurden 100000 Zufallszahlen in zahlen.dat geschrieben

Bitte waehlen Sie:
1: Zahlen erzeugen und in Datei schreiben
2: Zahlen aus Datei einlesen und arithmetische Mittel berechnen
3: Programm beenden
2
Bitte waehlen Sie:
1: Mittels Scanner
2: Mittels Streams
2
Bitte geben Sie einen Dateinamen ein:
zahlen.dat
Das arithmetische Mittel lautet: 49

Bitte waehlen Sie:
1: Zahlen erzeugen und in Datei schreiben
2: Zahlen aus Datei einlesen und arithmetische Mittel berechnen
3: Programm beenden
3
Auf Wiedersehen

2

Thursday, June 8th 2006, 8:29pm

wollt ihr die kompatiblität zwischen streams und den Java Utilities wahren, dann nehmt folgende Funktionen.

Die ganzen Typecasts machen sich jedoch an der Laufzeit bemerkbar

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void readStream(String filename) throws IOException {
		double mitte=0;
		DataInputStream input = new DataInputStream(
				new BufferedInputStream(
				new FileInputStream(filename)));
 
		int i=0;
		StringBuffer line = new StringBuffer();
		while(i<max) {
			//Erstelle mir einen String bis Zeilenumbruch
			byte x = input.readByte();
			line.append((char)x);
 
			//Dann erhoehe den Zaehler und beginne mit der naechsten Zahl
			if(x == '\n') {
				i++;
				mitte += Double.parseDouble(line.toString());
				line = new StringBuffer();
			}
		}
		input.close();
		System.out.printf(middle, mitte/max);
	}


Java Quellcode

1
2
3
4
5
6
7
8
9
static void writeStream(String filename) throws IOException {
		DataOutputStream output = new DataOutputStream(
				new BufferedOutputStream(
				new FileOutputStream(filename)));
		for(int i=0; i<max; i++) 
			output.writeBytes((Math.random()*100)+"\n");
		output.close();
		System.out.printf(writeSuccess, filename);
	}

Similar threads

Social bookmarks