Update of exercises

main
Thomas Smits 2024-11-20 11:13:15 +01:00
parent ac63d7353e
commit 52cb569f25
59 changed files with 1468 additions and 32 deletions

View File

@ -1,6 +1,6 @@
# `BufferedReader` zum zeilenweisen Lesen einsetzen # `BufferedReader` zum zeilenweisen Lesen einsetzen
## Lernziel ## Lernziel
[Musterlösung](solution/)
Daten Zeilenweise mit einem `BufferedReader` verwenden und dabei das Decorator Pattern einsetzen. Daten Zeilenweise mit einem `BufferedReader` verwenden und dabei das Decorator Pattern einsetzen.

View File

@ -0,0 +1,5 @@
# Lösung: `BufferedReader` zum zeilenweisen Lesen einsetzen
Musterlösung:
[pr2.io.buffered_reader](../../solutions/src/main/java/pr2/io/buffered_reader/)

View File

@ -1,6 +1,6 @@
# DataOutputStream # DataOutputStream
## Lernziel ## Lernziel
[Musterlösung](solution/)
Daten mit einem `DataOutputStreams` manuell serialisieren. Daten mit einem `DataOutputStreams` manuell serialisieren.

View File

@ -0,0 +1,5 @@
# Lösung: DataOutputStream
Musterlösung:
[pr2.io.datainputoutput_1](../../solutions/src/main/java/pr2/io/datainputoutput_1/)

View File

@ -1,6 +1,6 @@
# DataOutputStream durch Serialisierung ersetzen # DataOutputStream durch Serialisierung ersetzen
## Lernziel ## Lernziel
[Musterlösung](solution/)
Daten mit einem `ObjectOutputStreams` serialisieren. Daten mit einem `ObjectOutputStreams` serialisieren.

View File

@ -0,0 +1,5 @@
# Lösung: DataOutputStream durch Serialisierung ersetzen
Musterlösung:
[pr2.io.datainputoutput_2](../../solutions/src/main/java/pr2/io/datainputoutput_2/)

View File

@ -1,6 +1,6 @@
# Daten mit `DataOutputStream` und `DataInputStream` verarbeiten # Daten mit `DataOutputStream` und `DataInputStream` verarbeiten
## Lernziel ## Lernziel
[Musterlösung](solution/)
Ein eigenes Format für die Daten einer Klasse definieren und diese Dann in einer Datei speichern und aus dieser wieder laden. Ein eigenes Format für die Daten einer Klasse definieren und diese Dann in einer Datei speichern und aus dieser wieder laden.

View File

@ -0,0 +1,5 @@
# Lösung: Daten mit `DataOutputStream` und `DataInputStream` verarbeiten
Musterlösung:
[pr2.io.data_output](../../solutions/src/main/java/pr2/io/data_output/)

View File

@ -1,6 +1,6 @@
# Daten mit einem `InputStream` lesen # Daten mit einem `InputStream` lesen
## Lernziel ## Lernziel
[Musterlösung](solution/)
Einen `InputStream` benutzen, um Daten aus einer Datei zu lesen. Einen `InputStream` benutzen, um Daten aus einer Datei zu lesen.

View File

@ -0,0 +1,5 @@
# Lösung: Daten mit einem `InputStream` lesen
Musterlösung:
[pr2.io.datei_lesen](../../solutions/src/main/java/pr2/io/datei_lesen/)

View File

@ -1,6 +1,6 @@
# Daten mit einem `OutputStream` schreiben # Daten mit einem `OutputStream` schreiben
## Lernziel ## Lernziel
[Musterlösung](solution/)
Einen `OutputStream` verwenden, um Daten zu schreiben. Einen `OutputStream` verwenden, um Daten zu schreiben.

View File

@ -0,0 +1,5 @@
# Lösung: Daten mit einem `OutputStream` schreiben
Musterlösung:
[pr2.io.datei_schreiben](../../solutions/src/main/java/pr2/io/datei_schreiben/)

View File

@ -1,6 +1,6 @@
# Filesystem-Abstraktion mit `File` # Filesystem-Abstraktion mit `File`
## Lernziel ## Lernziel
[Musterlösung](solution/)
Die Klasse `Path` einsetzen, um plattformunabhängig Operationen auf dem Dateisystem durchzuführen. Die Klasse `Path` einsetzen, um plattformunabhängig Operationen auf dem Dateisystem durchzuführen.

View File

@ -0,0 +1,5 @@
# Lösung: Filesystem-Abstraktion mit `File`
Musterlösung:
[pr2.io.file](../../solutions/src/main/java/pr2/io/file/)

View File

@ -1,6 +1,6 @@
# Fileattribute lesen # Fileattribute lesen
## Lernziel ## Lernziel
[Musterlösung](solution/)
Methoden der Klassen `Path` und `Files` nutzen und verstehen. Methoden der Klassen `Path` und `Files` nutzen und verstehen.

View File

@ -0,0 +1,5 @@
# Lösung: Fileattribute lesen
Musterlösung:
[pr2.io.filetest](../../solutions/src/main/java/pr2/io/filetest/)

View File

@ -1,6 +1,6 @@
# `FilterReader` # `FilterReader`
## Lernziel ## Lernziel
[Musterlösung](solution/)
Einen eigenen Filter in Form eines `FilterReaders` programmieren und hiermit in den Datenstrom eingreifen. Einen eigenen Filter in Form eines `FilterReaders` programmieren und hiermit in den Datenstrom eingreifen.

View File

@ -0,0 +1,5 @@
# Lösung: `FilterReader`
Musterlösung:
[pr2.io.filter](../../solutions/src/main/java/pr2/io/filter/)

View File

@ -1,6 +1,6 @@
# Konsolen Input/Output # Konsolen Input/Output
## Lernziel ## Lernziel
[Musterlösung](solution/)
Daten von der Konsole lesen und über eine Ausgabeumlenkung in eine Datei umlenken. `PrintStream` und `InputStreamReader` einsetzen. Daten von der Konsole lesen und über eine Ausgabeumlenkung in eine Datei umlenken. `PrintStream` und `InputStreamReader` einsetzen.

View File

@ -0,0 +1,5 @@
# Lösung: Konsolen Input/Output
Musterlösung:
[pr2.io.konsole](../../solutions/src/main/java/pr2/io/konsole/)

View File

@ -1,6 +1,6 @@
# Zeilen einer Textdatei zählen # Zeilen einer Textdatei zählen
## Lernziel ## Lernziel
[Musterlösung](solution/)
Dateien zeilenweise lesen und verarbeiten. Dateien zeilenweise lesen und verarbeiten.

View File

@ -0,0 +1,5 @@
# Lösung: Zeilen einer Textdatei zählen
Musterlösung:
[pr2.io.linecounter](../../solutions/src/main/java/pr2/io/linecounter/)

View File

@ -1,6 +1,6 @@
# `RandomAccessFile` # `RandomAccessFile`
## Lernziel ## Lernziel
[Musterlösung](solution/)
`RandomAccessFile` sowohl zum Lesen, als auch zum Schreiben von Daten einsetzen. Verstehen, dass man sich wahlfrei durch die Datei bewegen kann. `RandomAccessFile` sowohl zum Lesen, als auch zum Schreiben von Daten einsetzen. Verstehen, dass man sich wahlfrei durch die Datei bewegen kann.

View File

@ -0,0 +1,5 @@
# Lösung: `RandomAccessFile`
Musterlösung:
[pr2.io.random_access](../../solutions/src/main/java/pr2/io/random_access/)

View File

@ -1,6 +1,6 @@
# `Reader` verwenden # `Reader` verwenden
## Lernziel ## Lernziel
[Musterlösung](solution/)
Textdaten mithilfe von `Reader` verarbeiten. Textdaten mithilfe von `Reader` verarbeiten.

View File

@ -0,0 +1,5 @@
# Lösung: `Reader` verwenden
Musterlösung:
[pr2.io.reader_writer](../../solutions/src/main/java/pr2/io/reader_writer/)

View File

@ -1,6 +1,6 @@
# Rot13-Verschlüsselung # Rot13-Verschlüsselung
## Lernziel ## Lernziel
[Musterlösung](solution/)
Funktionsweise und Einsatz von Filtern. Funktionsweise und Einsatz von Filtern.

View File

@ -0,0 +1,5 @@
# Lösung: Rot13-Verschlüsselung
Musterlösung:
[pr2.io.rot13](../../solutions/src/main/java/pr2/io/rot13/)

View File

@ -1,6 +1,6 @@
# Datei zerhacken # Datei zerhacken
## Lernziel ## Lernziel
[Musterlösung](solution/)
Daten byteweise aus einem Stream lesen. Daten byteweise aus einem Stream lesen.

View File

@ -0,0 +1,5 @@
# Lösung: Datei zerhacken
Musterlösung:
[pr2.io.scrambler](../../solutions/src/main/java/pr2/io/scrambler/)

View File

@ -1,6 +1,6 @@
# Serialisierung # Serialisierung
## Lernziel ## Lernziel
[Musterlösung](solution/)
Serialisierung einsetzen können, um Objekte zu persistieren und wieder zu laden. Serialisierung einsetzen können, um Objekte zu persistieren und wieder zu laden.

View File

@ -0,0 +1,5 @@
# Lösung: Serialisierung
Musterlösung:
[pr2.io.serialisierung](../../solutions/src/main/java/pr2/io/serialisierung/)

View File

@ -57,22 +57,22 @@ Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstat
| 43. | Ausnahmen | [Eigene Exception schreiben](Ausnahmen_003/readme.md) | [](Ausnahmen_003/solution/) | | 43. | Ausnahmen | [Eigene Exception schreiben](Ausnahmen_003/readme.md) | [](Ausnahmen_003/solution/) |
| 44. | Ausnahmen | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md) | [](Ausnahmen_004/solution/) | | 44. | Ausnahmen | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md) | [](Ausnahmen_004/solution/) |
| 45. | Ausnahmen | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md) | [](Ausnahmen_005/solution/) | | 45. | Ausnahmen | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md) | [](Ausnahmen_005/solution/) |
| 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input_und_Output_001/readme.md) | | | 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input_und_Output_001/readme.md) | [](Input_und_Output_001/solution/) |
| 47. | Input und Output | [DataOutputStream](Input_und_Output_002/readme.md) | | | 47. | Input und Output | [DataOutputStream](Input_und_Output_002/readme.md) | [](Input_und_Output_002/solution/) |
| 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input_und_Output_003/readme.md) | | | 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input_und_Output_003/readme.md) | [](Input_und_Output_003/solution/) |
| 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input_und_Output_004/readme.md) | | | 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input_und_Output_004/readme.md) | [](Input_und_Output_004/solution/) |
| 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input_und_Output_005/readme.md) | | | 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input_und_Output_005/readme.md) | [](Input_und_Output_005/solution/) |
| 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input_und_Output_006/readme.md) | | | 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input_und_Output_006/readme.md) | [](Input_und_Output_006/solution/) |
| 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input_und_Output_007/readme.md) | | | 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input_und_Output_007/readme.md) | [](Input_und_Output_007/solution/) |
| 53. | Input und Output | [Fileattribute lesen](Input_und_Output_008/readme.md) | | | 53. | Input und Output | [Fileattribute lesen](Input_und_Output_008/readme.md) | [](Input_und_Output_008/solution/) |
| 54. | Input und Output | [`FilterReader`](Input_und_Output_009/readme.md) | | | 54. | Input und Output | [`FilterReader`](Input_und_Output_009/readme.md) | [](Input_und_Output_009/solution/) |
| 55. | Input und Output | [Konsolen Input/Output](Input_und_Output_010/readme.md) | | | 55. | Input und Output | [Konsolen Input/Output](Input_und_Output_010/readme.md) | [](Input_und_Output_010/solution/) |
| 56. | Input und Output | [Zeilen einer Textdatei zählen](Input_und_Output_011/readme.md) | | | 56. | Input und Output | [Zeilen einer Textdatei zählen](Input_und_Output_011/readme.md) | [](Input_und_Output_011/solution/) |
| 57. | Input und Output | [`RandomAccessFile`](Input_und_Output_012/readme.md) | | | 57. | Input und Output | [`RandomAccessFile`](Input_und_Output_012/readme.md) | [](Input_und_Output_012/solution/) |
| 58. | Input und Output | [`Reader` verwenden](Input_und_Output_013/readme.md) | | | 58. | Input und Output | [`Reader` verwenden](Input_und_Output_013/readme.md) | [](Input_und_Output_013/solution/) |
| 59. | Input und Output | [Rot13-Verschlüsselung](Input_und_Output_014/readme.md) | | | 59. | Input und Output | [Rot13-Verschlüsselung](Input_und_Output_014/readme.md) | [](Input_und_Output_014/solution/) |
| 60. | Input und Output | [Datei zerhacken](Input_und_Output_015/readme.md) | | | 60. | Input und Output | [Datei zerhacken](Input_und_Output_015/readme.md) | [](Input_und_Output_015/solution/) |
| 61. | Input und Output | [Serialisierung](Input_und_Output_016/readme.md) | | | 61. | Input und Output | [Serialisierung](Input_und_Output_016/readme.md) | [](Input_und_Output_016/solution/) |
| 62. | Generische Typen | [Einen generischen Typ schreiben](Generische_Typen_001/readme.md) | | | 62. | Generische Typen | [Einen generischen Typ schreiben](Generische_Typen_001/readme.md) | |
| 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische_Typen_002/readme.md) | | | 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische_Typen_002/readme.md) | |
| 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische_Typen_003/readme.md) | | | 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische_Typen_003/readme.md) | |

View File

@ -0,0 +1,36 @@
package pr2.io.buffered_reader;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/**
* Liest eine Textdatei und gibt den Inhalt auf der Konsole aus.
*/
public class LineNumberPrinter {
/**
* Hauptmethode.
*
* @param args Kommandozeilen-Argumente.
*/
public static void main(String[] args) {
String filename = args.length == 1
? args[0]
: "pr2/io/reader_writer/kafka.txt";
try (BufferedReader r = new BufferedReader(new FileReader(filename))) {
String line;
int count = 1;
while ((line = r.readLine()) != null) {
System.out.printf("%3d: %s%n", count, line);
count++;
}
} catch (IOException e) {
System.err.println("IO-Problem: " + e);
}
}
}

View File

@ -0,0 +1,172 @@
package pr2.io.data_output;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Ein Dame-Brett.
*/
public class Board {
/**
* Belegung des Brettes.
*/
private final Color[][] brett = new Color[8][8];
/**
* Liest den Inhalt aus einer Datei.
*
* @param file Dateipfad.
* @return das gelesene Spielfeld
* @throws IOException IO-Probleme
*/
public static Board loadFromFile(String file) throws IOException {
Board result = new Board();
DataInputStream dis = new DataInputStream(new FileInputStream(file));
String header = dis.readUTF();
if (!"Schachbrett".equals(header)) {
dis.close();
throw new IOException("Falsches Dateiformat");
}
while (true) {
int x = dis.readByte();
int y = dis.readByte();
int ordinal = dis.readInt();
if (x == 0xff || y == 0xff || ordinal == -1) {
break;
}
result.brett[x][y] = Color.values()[ordinal];
}
dis.close();
return result;
}
/**
* Schreibt den Inhalt des Spielfeldes in eine Datei.
*
* @param file Dateiname.
* @throws IOException IO-Probleme
*/
public void writeToFile(String file) throws IOException {
DataOutputStream dos = new DataOutputStream(
new FileOutputStream(file));
dos.writeUTF("Schachbrett");
for (int x = 0; x < brett.length; x++) {
for (int y = 0; y < brett[x].length; y++) {
Color f = brett[x][y];
if (f != null) {
dos.writeByte(x);
dos.writeByte(y);
dos.writeInt(f.ordinal());
}
}
}
dos.writeByte(0xff);
dos.writeByte(0xff);
dos.writeInt(-1);
dos.close();
}
/**
* Setzt einen Stein an die gegebene Koordinate.
*
* @param koordinate Koordinate in "a1"-Notation.
* @param farbe Fabe des Spielsteins.
*/
public void set(String koordinate, Color farbe) {
Tupel t = parseCoordinates(koordinate);
brett[t.x][t.y] = farbe;
}
/**
* Wandelt textuelle Koordinaten in x- und y-Wert um.
*
* @param koordinate Koordinate als String.
* @return Koordinate als Integer-Tupel.
*/
private Tupel parseCoordinates(String koordinate) {
char buchstabe = koordinate.toLowerCase().charAt(0);
char zahl = koordinate.charAt(1);
Tupel t = new Tupel();
t.y = buchstabe - 'a';
t.x = zahl - '1';
if (t.x < 0 || t.x > 7) {
throw new IllegalArgumentException();
}
if (t.y < 0 || t.y > 7) {
throw new IllegalArgumentException();
}
return t;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder result = new StringBuilder();
char y = '1';
result.append(" ");
for (char c : "abcdefgh".toCharArray()) {
result.append(' ').append(c);
}
result.append("\n");
for (Color[] figurs : brett) {
result.append(y++);
for (Color figur : figurs) {
if (figur != null) {
result.append(' ').append(figur);
}
else {
result.append(" ");
}
}
result.append("\n");
}
return result.toString();
}
/**
* Tupel von zwei int-Werten.
*/
private static class Tupel {
int x;
int y;
}
}

View File

@ -0,0 +1,30 @@
package pr2.io.data_output;
/**
* Farben der Spielsteine.
*/
public enum Color {
/**
* Schwarzer Stein.
*/
BLACK,
/**
* Weißer Stein.
*/
WHITE;
/**
* @see java.lang.Enum#toString()
*/
@Override
public String toString() {
if (this == Color.BLACK) {
return "B";
}
else {
return "W";
}
}
}

View File

@ -0,0 +1,63 @@
package pr2.io.data_output.test;
import org.junit.jupiter.api.Test;
import pr2.io.data_output.Board;
import pr2.io.data_output.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* Test.
*/
public class BoardTest {
private static final byte[] RESULT = new byte[] {
0x00, 0x0B, 0x53, 0x63, 0x68, 0x61, 0x63, 0x68, 0x62, 0x72, 0x65,
0x74, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06,
0x00, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x02,
0x04, 0x00, 0x00, 0x00, 0x01, 0x04, 0x05, 0x00, 0x00, 0x00, 0x01,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00,
0x00, (byte) 0xff, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
(byte) 0xFF, (byte) 0xFF
};
/**
* Test für die Implementierung des Spielbrettes.
*
* @throws IOException Datei-Probleme.
*/
@Test
void testDame() throws IOException {
Board s = new Board();
s.set("a1", Color.BLACK);
s.set("b1", Color.WHITE);
s.set("h1", Color.BLACK);
s.set("h2", Color.BLACK);
s.set("a8", Color.BLACK);
s.set("f8", Color.BLACK);
s.set("f5", Color.WHITE);
s.set("e3", Color.WHITE);
s.set("g2", Color.WHITE);
String stringRepresentation = s.toString();
s.writeToFile("/tmp/daten.dat");
s = Board.loadFromFile("/tmp/daten.dat");
assertEquals(stringRepresentation, s.toString());
FileOutputStream fos = new FileOutputStream("/tmp/testdata.dat");
fos.write(RESULT);
fos.close();
s = Board.loadFromFile("/tmp/testdata.dat");
assertEquals(stringRepresentation, s.toString());
}
}

View File

@ -0,0 +1,43 @@
package pr2.io.datainputoutput_1;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateReader {
public static void main(String[] args) {
DataInputStream dis = null;
try {
DateFormat df = new SimpleDateFormat(DateWriter.FORMAT);
dis = new DataInputStream(
new FileInputStream(DateWriter.DATEINAME));
long time = dis.readLong();
System.out.printf("Das Datum war: %s%n%n",
df.format(new Date(time)));
} catch (FileNotFoundException e) {
System.err.printf("Datei %s kann nicht gelesen werden: %s%n%n",
DateWriter.DATEINAME, e.getMessage());
System.exit(1);
} catch (IOException e) {
System.err.printf("Fehler beim Lesen der Datei %s:%s%n%n",
DateWriter.DATEINAME, e.getMessage());
System.exit(1);
} finally {
if (dis != null) {
try {
dis.close();
} catch (IOException e) {
// ignore
}
}
}
}
}

View File

@ -0,0 +1,63 @@
package pr2.io.datainputoutput_1;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateWriter {
/**
* Dateiname mit den Testdaten.
*/
public static final String DATEINAME = "/tmp/test.data";
/**
* Datumsformat.
*/
public static final String FORMAT = "yyyy-MM-dd";
public static void main(String[] args) {
if (args.length != 1) {
System.err.printf("Bitte eine Datum im Format %s angeben%n%n",
FORMAT);
System.exit(1);
}
DataOutputStream dos = null;
try {
DateFormat df = new SimpleDateFormat(FORMAT);
Date date = df.parse(args[0]);
dos = new DataOutputStream(
new FileOutputStream(DATEINAME));
dos.writeLong(date.getTime());
} catch (ParseException e) {
System.err.printf("%s ist kein gültiges Datumsformat: %s%n%n",
args[0], FORMAT);
System.exit(1);
} catch (FileNotFoundException e) {
System.err.printf("Datei %s kann nicht geschrieben werden: %s%n%n",
DATEINAME, e.getMessage());
System.exit(1);
} catch (IOException e) {
System.err.printf("Fehler beim Schreiben der Datei %s:%s%n%n",
DATEINAME, e.getMessage());
System.exit(1);
} finally {
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
// ignore
}
}
}
}
}

View File

@ -0,0 +1,45 @@
package pr2.io.datainputoutput_2;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateReader {
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
DateFormat df = new SimpleDateFormat(DateWriter.FORMAT);
ois = new ObjectInputStream(
new FileInputStream(DateWriter.DATEINAME));
Date date = (Date) ois.readObject();
System.out.printf("Das Datum war: %s%n%n", df.format(date));
} catch (FileNotFoundException e) {
System.err.printf("Datei %s kann nicht gelesen werden: %s%n%n",
DateWriter.DATEINAME, e.getMessage());
System.exit(1);
} catch (IOException e) {
System.err.printf("Fehler beim Lesen der Datei %s:%s%n%n",
DateWriter.DATEINAME, e.getMessage());
System.exit(1);
} catch (ClassNotFoundException e) {
// Date ist Teil der Library, ist immer vorhanden
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
// ignore
}
}
}
}
}

View File

@ -0,0 +1,63 @@
package pr2.io.datainputoutput_2;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateWriter {
/**
* Dateiname mit den Testdaten.
*/
public static final String DATEINAME = "/tmp/test.ser";
/**
* Datumsformat.
*/
public static final String FORMAT = "yyyy-MM-dd";
public static void main(String[] args) {
if (args.length != 1) {
System.err.printf("Bitte eine Datum im Format %s angeben%n%n",
FORMAT);
System.exit(1);
}
ObjectOutputStream dos = null;
try {
DateFormat df = new SimpleDateFormat(FORMAT);
Date date = df.parse(args[0]);
dos = new ObjectOutputStream(
new FileOutputStream(DATEINAME));
dos.writeObject(date);
} catch (ParseException e) {
System.err.printf("%s ist kein gültiges Datumsformat: %s%n%n",
args[0], FORMAT);
System.exit(1);
} catch (FileNotFoundException e) {
System.err.printf("Datei %s kann nicht geschrieben werden: %s%n%n",
DATEINAME, e.getMessage());
System.exit(1);
} catch (IOException e) {
System.err.printf("Fehler beim Schreiben der Datei %s:%s%n%n",
DATEINAME, e.getMessage());
System.exit(1);
} finally {
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
// ignore
}
}
}
}
}

View File

@ -0,0 +1,33 @@
package pr2.io.datei_lesen;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Daten aus einer Datei lesen.
*/
public class ReadData {
/**
* Datei.
*/
private static final String FILE = "pr2/io/datei_lesen/daten.dat";
/**
* Hauptmethode.
*
* @param args Kommandozeilenargumente.
*/
public static void main(String[] args) {
try (InputStream is = new FileInputStream(FILE)) {
int data;
while ((data = is.read()) != -1) {
System.out.print("0x" + Integer.toHexString(data) + " ");
}
} catch (IOException e) {
System.err.println("Problem mit Datei: " + e);
}
}
}

View File

@ -0,0 +1,33 @@
package pr2.io.datei_schreiben;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* Daten aus einer Datei lesen.
*/
public class WriteData {
/**
* Datei.
*/
public static final String FILE = "pr2/io/datei_schreiben/daten.dat";
/**
* Hauptmethode.
*
* @param args Kommandozeilenargumente.
*/
public static void main(String[] args) {
try (OutputStream os = new FileOutputStream(FILE)) {
os.write(new byte[] {(byte) 0xca, (byte) 0xff, (byte) 0xfe,
(byte) 0xba, (byte) 0xbe, (byte) 0x00, (byte) 0xde,
(byte) 0xad, (byte) 0xbe, (byte) 0xef});
} catch (IOException e) {
System.err.println("Problem mit Datei: " + e);
}
}
}

View File

@ -0,0 +1,39 @@
package pr2.io.datei_schreiben.test;
import org.junit.jupiter.api.Test;
import pr2.io.datei_schreiben.WriteData;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static pr2.io.datei_schreiben.WriteData.FILE;
/**
* Test für die geschriebenen Daten.
*/
public class DataTest {
/**
* Geschriebene Daten testen.
*
* @throws IOException Datei-Probleme.
*/
@Test
void testData() throws IOException {
WriteData.main(new String[0]);
InputStream is = new FileInputStream(FILE);
byte[] buffer = new byte[10];
is.read(buffer);
assertArrayEquals(
new byte[] {(byte) 0xca, (byte) 0xff, (byte) 0xfe, (byte) 0xba,
(byte) 0xbe, (byte) 0x00, (byte) 0xde, (byte) 0xad,
(byte) 0xbe, (byte) 0xef}, buffer);
is.close();
}
}

View File

@ -0,0 +1,94 @@
package pr2.io.file;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Stream;
/**
* Klasse, die das Dateisystem durchläuft und Informationen ausgibt.
*/
public class FilesystemWalker {
/**
* Haupt-Methode.
*
* @param args Kommandozeilen-Argumente.
* @throws IOException IO-Probleme
*/
public static void main(String[] args) throws IOException {
String path = args.length > 0 ? args[0] : ".";
Path root = Path.of(path).normalize().toAbsolutePath();
System.out.println("Untersuche: " + root);
System.out.println();
long total = walk(root);
System.out.println();
System.out.println("Gesamtgröße: " + niceSize(total));
}
/**
* Rekursive Methode, um den Baum zu durchlaufen.
*
* @param startDir Verzeichnis, bei dem gestartet werden
* soll.
* @return die Größe des Verzeichnisses.
*/
private static long walk(Path startDir) {
long size = 0;
if (!Files.isDirectory(startDir)) {
throw new IllegalArgumentException(
startDir + " ist kein Verzeichnis.");
}
try (Stream<Path> fileStream = Files.list(startDir)) {
List<Path> files = fileStream.toList();
for (Path file : files) {
if (Files.isDirectory(file)
&& Files.isReadable(file)
&& Files.isExecutable(file)
&& !Files.isSymbolicLink(file)
&& Files.exists(file)) {
long dirSize = walk(file);
size += dirSize;
System.out.printf("%s - %s%n", niceSize(dirSize), file);
}
else if (Files.exists(file) && !Files.isSymbolicLink(file)) {
size += Files.size(file);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return size;
}
/**
* Wandelt die Größe in eine schönere Darstellung um.
*
* @param size Die Größe.
* @return Schönere Darstellung.
*/
private static String niceSize(long size) {
if (size > 1000_000L) {
return String.format("%.1f MByte", size / 1024.0 / 1024.0);
}
else if (size > 1000L) {
return String.format("%.1f kByte", size / 1024.0);
}
else {
return String.format("%d Byte", size);
}
}
}

View File

@ -0,0 +1,40 @@
package pr2.io.filetest;
import java.nio.file.Files;
import java.io.IOException;
import java.nio.file.Path;
public class FileInfo {
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println(
"Bitte eine Datei oder ein Verzeichnis angeben");
System.exit(1);
}
Path path = Path.of(args[0]).normalize().toAbsolutePath();
if (Files.exists(path)) {
System.out.printf("%s existiert%n", path);
System.out.printf("%s ist %d Bytes groß%n", path, Files.size(path));
}
if (Files.isDirectory(path)) {
System.out.printf("%s ist ein Verzeichnis%n", path);
}
if (Files.isRegularFile(path)) {
System.out.printf("%s ist ein normale Datei%n", path);
}
if (Files.isReadable(path)) {
System.out.printf("%s darf gelesen werden%n", path);
}
if (Files.isWritable(path)) {
System.out.printf("%s darf geschrieben werden%n", path);
}
}
}

View File

@ -0,0 +1,36 @@
package pr2.io.filter;
import java.io.FilterReader;
import java.io.IOException;
import java.io.Reader;
/**
* Filter-Reader, der den Inhalt in Großbuchstaben umwandelt.
*/
public class UCaseReader extends FilterReader {
/**
* Legt einen neuen Reader an.
*
* @param in Reader, von dem die Daten gelesen werden.
*/
public UCaseReader(Reader in) {
super(in);
}
/**
* @see FilterReader#read(char[], int, int).
*/
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
int charsGelesen = super.read(cbuf, off, len);
for (int i = 0; i < cbuf.length; i++) {
cbuf[i] = Character.toUpperCase(cbuf[i]);
}
return charsGelesen;
}
}

View File

@ -0,0 +1,34 @@
package pr2.io.filter.test;
import org.junit.jupiter.api.Test;
import pr2.io.filter.UCaseReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* Test für die Rot13 "Verschlüsselung".
*/
public class UCaseReaderTest {
/**
* Testmethode.
*
* @throws IOException IO-Probleme
*/
@Test
void testReader() throws IOException {
BufferedReader br = new BufferedReader(
new UCaseReader(new StringReader(
"Dies ist" + " ein Test für den UCASE-Reader.")));
String line = br.readLine();
assertEquals("DIES IST EIN TEST FÜR DEN UCASE-READER.", line);
br.close();
}
}

View File

@ -0,0 +1,46 @@
package pr2.io.konsole;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
/**
* Liest einen Text von der Console und
* schreibt ihn dann in eine Datei. Allerdings
* erfolgt das Schreiben über eine Ausgabeumleitung
* und nicht über Dateioperationen.
*/
public class ConsoleToFile {
/**
* Logfile für Ausgaben.
*/
private static final String LOGFILE = "console.log";
/**
* Hauptmethode.
*
* @param args Kommandozeile-Argumente.
*/
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
PrintStream ps = new PrintStream(LOGFILE)) {
System.setOut(ps);
String line;
int count = 1;
while ((line = br.readLine()) != null) {
System.out.println(line);
System.err.println(count++);
}
} catch (IOException ex) {
System.err.println("Dateiproblem: " + ex);
}
}
}

View File

@ -0,0 +1,29 @@
package pr2.io.linecounter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class LineCounter {
public static void main(String[] args) throws IOException {
int lines = 0;
if (args.length != 1) {
System.err.println("Bitte eine Datei angeben");
System.exit(1);
}
BufferedReader br = new BufferedReader(new FileReader(args[0]));
while (br.readLine() != null) {
lines++;
}
br.close();
System.out.printf("Datei: %s hat %d Zeilen%n", args[0], lines);
}
}

View File

@ -0,0 +1,58 @@
package pr2.io.random_access;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* Sortierung von Dateien (in place).
*/
public class FileSort {
/**
* Sortiert die Datei von Byte-Werten per Bubble-Sort.
*
* @param filename Dateiname
* @throws IOException IO-Probleme
*/
public static void sortFile(String filename) throws IOException {
RandomAccessFile rf = new RandomAccessFile(filename, "rw");
byte b1; // erstes Byte
byte b2; // zweites Byte
long pos = 0;
boolean swap = false;
while (true) {
// an die Position springen
rf.seek(pos);
// zwei Bytes lesen
b1 = rf.readByte();
b2 = rf.readByte();
if (b1 > b2) {
// erstes ist größer als zweites, austauschen
rf.seek(pos);
rf.write(b2);
rf.write(b1);
swap = true;
}
pos++;
if (pos >= rf.length() - 1) {
if (swap) {
pos = 0;
swap = false;
}
else {
break;
}
}
}
rf.close();
}
}

View File

@ -0,0 +1,63 @@
package pr2.io.random_access.test;
import org.junit.jupiter.api.Test;
import pr2.io.random_access.FileSort;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Testet die Sortierung per Random-Access-File.
*/
public class FileSortTest {
/**
* Kopiert die Datei f1 als Datei f2.
*
* @param f1 Quell-Datei
* @param f2 Ziel-Datei
* @throws IOException IO-Probleme
*/
private static void copyFile(String f1, String f2) throws IOException {
FileInputStream fis = new FileInputStream(f1);
FileOutputStream fos = new FileOutputStream(f2);
int b;
while ((b = fis.read()) != -1) {
fos.write(b);
}
fis.close();
fos.close();
}
/**
* Testet die File-Sortierung.
*
* @throws IOException IO-Problem
*/
@Test
void testBubbleSort() throws IOException {
copyFile("data.dat", "output/data.dat");
FileSort.sortFile("output/data.dat");
InputStream is = new FileInputStream("output/data.dat");
int data;
byte lastByte = 0;
while ((data = is.read()) >= 0) {
byte b = (byte) data;
assertTrue(b >= lastByte);
lastByte = b;
}
is.close();
}
}

View File

@ -0,0 +1,34 @@
package pr2.io.reader_writer;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
* Liest eine Textdatei und gibt den Inhalt auf der Konsole aus.
*/
public class ReadAndPrintFile {
/**
* Hauptmethode.
*
* @param args Kommandozeilen-Argumente.
*/
public static void main(String[] args) {
String filename = args.length == 1
? args[0]
: "pr2/io/reader_writer/kafka.txt";
try (Reader r = new FileReader(filename)) {
char[] buffer = new char[1024];
int length;
while ((length = r.read(buffer)) >= 0) {
System.out.print(new String(buffer, 0, length));
}
} catch (IOException e) {
System.err.println("IO-Problem: " + e);
}
}
}

View File

@ -0,0 +1,25 @@
package pr2.io.rot13;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Rot13 {
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Bitte eine Datei angeben");
System.exit(1);
}
BufferedReader br = new BufferedReader(
new Rot13Reader(new FileReader(args[0])));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}
}

View File

@ -0,0 +1,24 @@
package pr2.io.rot13;
import java.io.FilterReader;
import java.io.IOException;
import java.io.Reader;
public class Rot13Reader extends FilterReader {
public Rot13Reader(Reader in) {
super(in);
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
int charsGelesen = super.read(cbuf, off, len);
for (int i = 0; i < cbuf.length; i++) {
cbuf[i] = cbuf[i] != '\n' ? (char) (cbuf[i] + 13) : '\n';
}
return charsGelesen;
}
}

View File

@ -0,0 +1,38 @@
package pr2.io.scrambler;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Scrambler {
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Bitte eine Datei angeben");
System.exit(1);
}
FileInputStream fis;
try {
fis = new FileInputStream(args[0]);
} catch (FileNotFoundException e) {
System.err.printf("Datei nicht gefunden: %s%n", args[0]);
System.exit(1);
return; // never reached
}
int input;
int count = 0;
while ((input = fis.read()) != -1) {
byte b = (byte) input;
if (count++ % 2 == 0) {
System.out.write(b);
}
}
fis.close();
}
}

View File

@ -0,0 +1,139 @@
package pr2.io.serialisierung;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* Ein Dame-Brett.
*/
public class Board implements Serializable {
/**
* Belegung des Brettes.
*/
private final Color[][] brett = new Color[8][8];
/**
* Liest den Inhalt aus einer Datei.
*
* @param file Dateipfad.
* @return das gelesene Spielfeld
* @throws IOException IO-Probleme
*/
public static Board loadFromFile(String file) throws IOException {
ObjectInputStream ois =
new ObjectInputStream(new FileInputStream(file));
Board result;
try {
result = (Board) ois.readObject();
ois.close();
} catch (ClassNotFoundException e) {
ois.close();
throw new IOException("Serialization: Class not found", e);
}
return result;
}
/**
* Schreibt den Inhalt des Spielfeldes in eine Datei.
*
* @param file Dateiname.
* @throws IOException IO-Probleme
*/
public void writeToFile(String file) throws IOException {
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(this);
oos.close();
}
/**
* Setzt einen Stein an die gegebene Koordinate.
*
* @param koordinate Koordinate in "a1"-Notation.
* @param farbe Fabe des Spielsteins.
*/
public void set(String koordinate, Color farbe) {
Tupel t = parseCoordinates(koordinate);
brett[t.x][t.y] = farbe;
}
/**
* Wandelt textuelle Koordinaten in x- und y-Wert um.
*
* @param koordinate Koordinate als String.
* @return Koordinate als Integer-Tupel.
*/
private Tupel parseCoordinates(String koordinate) {
char buchstabe = koordinate.toLowerCase().charAt(0);
char zahl = koordinate.charAt(1);
Tupel t = new Tupel();
t.y = buchstabe - 'a';
t.x = zahl - '1';
if (t.x < 0 || t.x > 7) {
throw new IllegalArgumentException();
}
if (t.y < 0 || t.y > 7) {
throw new IllegalArgumentException();
}
return t;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder result = new StringBuilder();
char y = '1';
result.append(" ");
for (char c : "abcdefgh".toCharArray()) {
result.append(' ').append(c);
}
result.append("\n");
for (Color[] figurs : brett) {
result.append(y++);
for (Color figur : figurs) {
if (figur != null) {
result.append(' ').append(figur);
}
else {
result.append(" ");
}
}
result.append("\n");
}
return result.toString();
}
/**
* Tupel von zwei int-Werten.
*/
private static class Tupel {
int x;
int y;
}
}

View File

@ -0,0 +1,30 @@
package pr2.io.serialisierung;
/**
* Farben der Spielsteine.
*/
public enum Color {
/**
* Schwarzer Stein.
*/
BLACK,
/**
* Weißer Stein.
*/
WHITE;
/**
* @see java.lang.Enum#toString()
*/
@Override
public String toString() {
if (this == Color.BLACK) {
return "B";
}
else {
return "W";
}
}
}

View File

@ -0,0 +1,46 @@
package pr2.io.serialisierung.test;
import org.junit.jupiter.api.Test;
import pr2.io.serialisierung.Board;
import pr2.io.serialisierung.Color;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* Test.
*/
public class BoardTest {
/**
* Test für die Implementierung des Spielbrettes.
*
* @throws IOException Datei-Probleme.
*/
@Test
void testDame() throws IOException {
Board s = new Board();
s.set("a1", Color.BLACK);
s.set("b1", Color.WHITE);
s.set("h1", Color.BLACK);
s.set("h2", Color.BLACK);
s.set("a8", Color.BLACK);
s.set("f8", Color.BLACK);
s.set("f5", Color.WHITE);
s.set("e3", Color.WHITE);
s.set("g2", Color.WHITE);
String stringRepresentation = s.toString();
s.writeToFile("/tmp/daten.dat");
s = Board.loadFromFile("/tmp/daten.dat");
assertEquals(stringRepresentation, s.toString());
s = Board.loadFromFile("testdata.dat");
assertEquals(stringRepresentation, s.toString());
}
}