Dateien

FIXME Datei.java → leseBytes()
FIXME PGM Raw Format?
FIXME 1. Beispiel mit Textdateien.

PGM-Dateien a.k.a. Portable Gray Map Bilder
PGM (Portable Graymap) ist ein Dateiformat zur Darstellung von Bildern in Graustufen.


P2
5 8
15
15 15  8 15 15
15  8  8  8 15
8  8  8  8  8
12 12 12 12 12
12  5 12  5 12
12 12 12 12 12
12  5 12  5 12
12 12 12 12 12
Dieser Code ergibt dieses Bild: . Und ja, es ist wirklich so klein wie es aussieht. Jeder Graustufenwert steht für ein einzelnes Pixel. Wenn man es etwas vergrößert (Faktor 50), sieht es so aus wie rechts.

PGM-Dateien bestehen aus Text und sind folgendermaßen aufgebaut:

  • Die erste Zeile (P2) kennzeichnet das PGM-Format.
  • Die beiden Zahlen „5 8“ in der zweiten Zeile beschreiben die Aufteilung der Pixel in Spalten und Zeilen (hier 5 Spalten und 8 Zeilen).
  • Die Zahl 15 in der dritten Zeile beschreibt die Anzahl der Graustufen - hier von Stufe 0 (Schwarz) bis Stufe 15 (Weiß).
  • In den folgenden Zeilen werden die einzelnen Grauwerte mit Hilfe von Zahlen und getrennt durch Leerzeichen dargestellt.
Dateizugriff mit Java

Als erstes Beispiel wollen wir die Datei l13-haus.pgm (runterladen!) einlesen und die Daten auf der Konsole ausgeben. Hierzu benötigen wir eine neue Helfer-Klasse Datei.java, die ähnlich wie die bereits bekannte Konsole.java unverändert im gleichen Ordner wie unsere Programme abgespeichert werden muss.

Danach können wir mit folgendem Beispiel-Code den Inhalt der Datei auf der Konsole ausgeben lassen (nachdem wir den Pfad zum Bild angepasst haben!).

Beispiel1.java

public class Beispiel1 {
    public static void main(String[] args) {
        String dateiname = "/home/christian/Downloads/haus.pgm";
 
        Konsole.schreibeZeile("Inhalt der Datei '" + dateiname + "':");
        Konsole.schreibeZeile("");
 
        Datei.LeseZugriff datei = Datei.oeffneZumLesen(dateiname);
 
        while (datei.nochDatenDa()) {
            String zeile = datei.leseZeile();
 
            Konsole.schreibeZeile(zeile);
        }
 
        Konsole.schreibeZeile("");
        Konsole.schreibeZeile("ENDE");
    }
}

Beispiel-Ausgabe in der Konsole

Inhalt der Datei '/home/christian/Downloads/haus.pgm':

P2
5 8
15
15 15  8 15 15
15  8  8  8 15
8  8  8  8  8
12 12 12 12 12
12  5 12  5 12
12 12 12 12 12
12  5 12  5 12
12 12 12 12 12

ENDE

Beispiel2.java

public class Beispiel2 {
    public static void main(String[] args) {
        String dateiname = "/home/christian/Downloads/geheim.pgm";
 
        Konsole.schreibeZeile("Erstelle die Datei '" + dateiname + "':");
        Konsole.schreibeZeile("");
 
        Datei.SchreibZugriff datei = Datei.oeffneZumSchreiben(dateiname);
 
        datei.schreibeZeile("P2");
        datei.schreibeZeile("16 16");
        datei.schreibeZeile("255");
        datei.schreibeZeile("255 255 255 255 255 0 0 0 0 0 0 0 255 255 255 255");
        datei.schreibeZeile("255 255 255 255 0 255 255 255 255 255 255 255 0 0 0 255");
        datei.schreibeZeile("255 255 255 255 255 0 0 0 0 0 0 255 255 0 0 255 ");
        datei.schreibeZeile("255 255 255 255 255 255 255 255 255 255 255 0 255 255 0 255");
        datei.schreibeZeile("255 255 255 255 255 255 255 255 255 255 0 0 0 255 255 0 ");
        datei.schreibeZeile("255 255 255 255 255 255 255 255 255 0 0 0 255 0 255 0");
        datei.schreibeZeile("255 255 255 255 255 255 255 255 0 0 0 255 255 0 255 0");
        datei.schreibeZeile("255 255 255 255 255 255 255 0 0 0 255 255 255 0 255 0");
        datei.schreibeZeile("255 255 255 255 255 255 0 0 0 255 255 255 255 0 255 0");
        datei.schreibeZeile("255 255 255 255 255 0 0 0 255 255 255 255 255 0 255 0");
        datei.schreibeZeile("255 255 255 255 0 0 0 255 255 255 255 255 255 0 255 0");
        datei.schreibeZeile("255 255 255 0 0 0 255 255 255 255 255 255 255 255 0 255");
        datei.schreibeZeile("255 255 0 0 0 255 255 255 255 255 255 255 255 255 255 255");
        datei.schreibeZeile("255 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255");
        datei.schreibeZeile("0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255");
        datei.schreibeZeile("0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255");
 
        Konsole.schreibeZeile("Fertig!");
    }
}

Datei.java

import java.io.*;
import java.util.Scanner;
 
public class Datei {
    private static Datei instance = new Datei();
 
    private Datei() {}
 
    public class LeseZugriff {
        private Scanner EingabeStream = null;
 
        private LeseZugriff(String dateiname) {
            try {
                EingabeStream = new Scanner(new File(dateiname));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
 
        public boolean oeffnenErfolgreich() {
            return EingabeStream != null;
        }
 
        public boolean nochDatenDa() {
            return EingabeStream.hasNext();
        }
 
        public String leseZeile() {
            return EingabeStream.nextLine();
        }
 
        public String[] leseCSVZeile() {
            return EingabeStream.nextLine().split("(?<!\\\\),");
        }
 
        public int leseZahl() {
            return EingabeStream.nextInt();
        }
 
        public double leseKommaZahl() {
            return EingabeStream.nextDouble();
        }
 
        public void schliessen() {
            EingabeStream.close();
        }
    }
 
    public class SchreibZugriff {
        private PrintStream AusgabeStream;
 
        private SchreibZugriff(String file) {
            try {
                AusgabeStream = new PrintStream(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
        public boolean oeffnenErfolgreich() {
            return AusgabeStream != null;
        }
 
        public void schreibeZeile(String text) {
            AusgabeStream.println(text);
        }
 
        public void schreibe(String text) {
            AusgabeStream.print(text);
        }
 
        public void schliessen() {
            AusgabeStream.flush();
            AusgabeStream.close();
        }
    }
 
    public static LeseZugriff oeffneZumLesen(String pfad) {
        return instance.new LeseZugriff(pfad);
    }
 
    public static SchreibZugriff oeffneZumSchreiben(String pfad) {
        return instance.new SchreibZugriff(pfad);
    }
}
Aufgabe 1
FIXME erstes beispiel mit Text-Datei statt PGM FIXME copy-programm FIXME rückwärts-programm FIXME invertieren durch graustufen - pixelgraustufe

Original1):

Invertiert: