Input/Output Java IO Writer - Subklassen

nobody76

Mitglied
Hallo, ich habe ein kleines Problem, ich soll eine Decorator Klasse schreiben, welche von der abstrakten Klasse java.io.Writer erbt. Aufgabenstellung:
The writing decorator may, for example, transform all characters to upper case, implement some statistics (e.g. character counts), or implement some cipher algorithm (e.g. ROT13).

Also meine leere Klasse sieht mal so aus:
Java:
import java.io.*;

public class UpperCWriter extends Writer {

    @Override
    public void write(char[] cbuf, int off, int len) throws IOException {
       
    }

    @Override
    public void flush() throws IOException {
       
    }

    @Override
    public void close() throws IOException {
   
    }
}

Ich hab mir gedacht, ich lehne mich an die Klasse BufferedWriter. Nur ich versteh nicht so ganz wie ich das am besten angehe, ich verstehe nicht was flush() machen soll, ich versteh auch nicht wirklich (und jetzt bitte keine Referenzen auf die JavaDoc) was der BufferedWriter macht oder der OutputStreamWriter, im Endeffekt sind das ja alles Subklassen von Writer. Ich kann mir noch nicht so richtig vorstellen, was ich machen soll. Vielleicht habt ihr ein paar Ansätze, Ideen, Tipps für mich.

LG
 

Tarrew

Top Contributor
Hast du dich denn mal mit dem Dekorator Pattern beschäftigt?

Es geht darum eine eine Klasse um eine gewisse Funktionalität zu erweitern bzw. auszuschmücken.
Also musst du deiner Klasse auch eine Klasse übergeben die sie eben erweitern soll.

Also ein erster Ansatz wäre die zu dekorierende Klasse im Konstruktor zu übergeben:
Java:
Writer decoratedWriter;

public UpperCWriter(Writer w) {
    decoratedWriter = w;
}

In der write Methode lässt du den übergebenen Writer dann wieder schreiben, nur eben nicht das originale Array, sondern das Array umgeformt in Großbuchstaben.

Mal als Beispiel:
Java:
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
    for (int i = 0; i < len; i++) {
        decoratedWriter.write(Character.toUpperCase(cbuf[i + off]));
    }
}

@Override
public void flush() throws IOException {
    decoratedWriter.flush();
}

public static void main(String[] args) throws IOException {
    UpperCWriter writer = new UpperCWriter(new PrintWriter(System.out));
    char[] msg = "lower case testnachricht".toCharArray();
    writer.write(msg, 0, msg.length);
    writer.flush();
}
 

nobody76

Mitglied
Hey vielen Dank für deine Antwort!!!
Also ich habe mir das Pattern angeschaut anhand dieses Beispiels:
einleitung6.svg

Also der Decorator wäre ja die Beilage oder? Also in unserem Fall der Writer und BufferedWriter, FileWriter, etc. wären die Klassen, die von der Beilage erben.

Aber ich glaub ich verstehe es noch nicht ganz wie es funktioniert, zumindest nicht in der java.io Hierarchie.
Es geht darum eine eine Klasse um eine gewisse Funktionalität zu erweitern bzw. auszuschmücken.
Also musst du deiner Klasse auch eine Klasse übergeben die sie eben erweitern soll.
mit deiner Klasse meinst du jetzt die UpperCWriter Klasse oder? Wie kann ich das verstehen, dass ich ihr eine Klasse übergeben muss, die sie erweitern soll?

Und was kann dieses flush() ???

LG
 

Tarrew

Top Contributor
mit deiner Klasse meinst du jetzt die UpperCWriter Klasse oder? Wie kann ich das verstehen, dass ich ihr eine Klasse übergeben muss, die sie erweitern soll?
Mein Codebeispiel deutet das eig. an. Im Konstruktor übergibst du eine Instanz vom Typ Writer. Der übergebene Writer wird dann mit den Eigenschaften des UpperCWriters erweitert.

Und was kann dieses flush() ???
LG
Bei sowas hilft es immer, wenn man einfach in die Dokumentation guckt:
public abstract void flush()
throws IOException
Flushes the stream. If the stream has saved any characters from the various write() methods in a buffer, write them immediately to their intended destination. Then, if that destination is another character or byte stream, flush it. Thus one flush() invocation will flush all the buffers in a chain of Writers and OutputStreams.
If the intended destination of this stream is an abstraction provided by the underlying operating system, for example a file, then flushing the stream guarantees only that bytes previously written to the stream are passed to the operating system for writing; it does not guarantee that they are actually written to a physical device such as a disk drive.

Specified by:
flush in interface Flushable
Throws:
IOException - If an I/O error occurs
 

nobody76

Mitglied
Okay vielen Dank.
Wenn ich das ganze jetzt umgekehrt machen will, also einen Decorator für die abstrakte Reader Klasse, zB ich lese ein File mit lauter Großbuchstaben und will dass es mein Reader übersetzt in Kleinbuchstaben, wie muss ich da vorgehen??

Java:
import java.io.IOException;
import java.io.Reader;

public class UCReader extends Reader {
  
    private Reader in;

    public UCReader(Reader in){
        this.in = in;
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        //Das hier bringt nichts, len ist immer 1 WARUM?
        for(int i = 0; i < len; i++){
            cbuf[i] = 'k';
            System.err.println(len);
        }
        return in.read(cbuf, off, len);
    }

    @Override
    public void close() throws IOException {
        in.close();      
    }

   public static void main(String[] args) throws IOException {
  
     Reader fr = new UCReader(new FileReader("justuppercaseletters.txt"));
    
     StringBuffer sb = new StringBuffer();
     int ch;
     while( (ch=fr.read()) != -1 )
        sb.append((char)ch);

     System.out.println(sb.toString());
   }
}
 
Zuletzt bearbeitet von einem Moderator:

nobody76

Mitglied
Nein das hilft mir gar nicht, es geht nicht darum wie ich es in LowerCase umschreibe, sondern wie ich das als Decorator der Reader Komponente implementiere. (Die for-Schleife ist nur ein Test-Code, der aber nichts ändert [da ich vermutlich an einer anderen Stelle was ändern muss]).
 

nobody76

Mitglied
Na das funktioniert so leider nicht, also meinst du in der überschriebenen read Methode? Weil dann müsste ja jetzt (mit dieser for-Schleife) lauter k's drinnen stehen. Tuts aber komischerweise nicht, deshalb denk ich ich muss es irgendwie und irgendwo anders implementieren, nur weiß ich leider nicht genau wo.
 

Joose

Top Contributor
Na das funktioniert so leider nicht, also meinst du in der überschriebenen read Methode? Weil dann müsste ja jetzt (mit dieser for-Schleife) lauter k's drinnen stehen. Tuts aber komischerweise nicht, deshalb denk ich ich muss es irgendwie und irgendwo anders implementieren, nur weiß ich leider nicht genau wo.
Du solltest auch einfach mal schauen welchen Code du aufrufst ;)

Java:
   public static void main(String[] args) throws IOException {

     Reader fr = new UCReader(new FileReader("justuppercaseletters.txt"));
  
     StringBuffer sb = new StringBuffer();
     int ch;
     while( (ch=fr.read()) != -1 )
        sb.append((char)ch);

     System.out.println(sb.toString());
   }
Du erstellst eine Instanz der Klasse "UCReader" und rufst von dieser Instanz die Methode "read()" auf.
Überschrieben hast du aber "read(char[], int, int)".
 

nobody76

Mitglied
Danke für deine Antwort. Hmm ja, das ist wohl ein Argument :rolleyes:
Ich würd aber auch gern einen BufferedReader drum rum erstellen zB:
Java:
BufferedReader br = new BufferedReader(new UCReader(new FileReader("test.txt")));

        String zeile1 = br.readLine();
        System.out.println(zeile1);

Dann passiert mit dieser for-Schleife auch wieder nichts, also ich weiß nicht ganz wo ich in read() dieses char-Array herbekommen kann, damit ich es auch da überschreiben kann. Verstehe nicht ganz wie das miteinander in Bezug steht.
 

Tarrew

Top Contributor
Java:
    @Override
   public int read(char[] cbuf, int off, int len)throwsIOException{
       //Das hier bringt nichts, len ist immer 1 WARUM?
       for(int i =0; i < len; i++){
            cbuf[i]='k';
            System.err.println(len);
       }
       return in.read(cbuf, off, len);
   }
Also nehmen wir mal an deine read Funktion wird irgendwo ausgeführt.
Dann füllst du das Array mit 'k's, okay. Aber dann im return rufst du die read-Funktion deines FileReaders auf und die überschreibt dir dein Array doch einfach wieder.

Und die readLine Methode vom BufferedReader ist wieder ne ganz andere Geschichte aber okay.
 

nobody76

Mitglied
Also ich hab gedacht ich kann dann dieses neue cbuf Array dem FileReader übergeben, ah ok das funktioniert so wohl nicht, aber was soll ich den returnen? Das mit dem int verwirrt mich ein bisschen, was passiert den mit dem char[]? Also ich weiß nur, dass es bei -1 fertig ist.
 

Tarrew

Top Contributor

nobody76

Mitglied
Tut mir leid, ich komm nicht mit.
Es wird ja von außen (der Main, oder vom BufferedReader [falls er darauf zugreift], oder von sonst was...) immer auf die read() zugegriffen oder? Aber die abstrakte Klasse Reader verlangt eine Implementierung von read(char[], int, int). Wie kann ich aber in meiner UCReader Klasse, auf das Array (das vom FileReader), also von in, zugreifen, so dass ich es ändern kann, zB jeden Buchstaben durch ein k auswechseln.
Sorry dass ich mich so dumm anstelle.
LG
 

Tarrew

Top Contributor
Java:
    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        //Erstelle Array in das der FileReader Daten liest
        char[] buf = new char[128];
        int bytesRead = in.read(buf, 0, buf.length);

        //mache irgendwas mit dem array
        Arrays.fill(buf, 0, bytesRead, 'k');
        return bytesRead;
    }

Wobei das read vom FileReader natürlich keinen Sinn macht wenn du es danach sowieso überschreibst mit 'k's.
 

nobody76

Mitglied
Vielen Dank, aber das cbuf kommt nie mehr vor darin?
Also ich würde eigentlich gerne das "vorhandene" Array (also welches der FileWriter einliest), welches das auch immer ist, überschreiben (bzw. toUpperCase machen) oder so.
 

Tarrew

Top Contributor
Das Array in das der FileReader die Daten einliest übergibst du selbst als ersten Paramter (siehe mein Kommentar im Code). Damit kannste dann machen was du willst.
 

nobody76

Mitglied
Aha okay, also buf ist dann das übergebene Array vom FileReader, okay, und wie könnte ich das jetzt noch so umschreiben, dass es auch zB so greift:
Java:
 BufferedReader br = new BufferedReader(new UPCReader(new FileReader("test.txt")));

        String zeile1 = br.readLine();
        System.out.println(zeile1);
       
        br.close();

Also das wäre ja eigentlich der Sinn vom Decorator oder?
Ich denke mal ich muss auch die read() verändern, so dass diese vielleicht read(char[], int, int) aufruft?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Java Writer funktioniert nicht mehr Java Basics - Anfänger-Themen 8
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
Ostkreuz Java Docs Java Basics - Anfänger-Themen 9
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
A Java Kurs / Tutorial Java Basics - Anfänger-Themen 6
K Java Lotto Spiel; ich komme nicht weiter Java Basics - Anfänger-Themen 15
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
P Java 2n Potenzieren Java Basics - Anfänger-Themen 1
J Java Hamster Java Basics - Anfänger-Themen 4
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
V Die Funktion des neuen Schlüsselworts in Java Java Basics - Anfänger-Themen 1
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
laxla123 If-else Java Java Basics - Anfänger-Themen 4
RashAGhul Java Verwaltungstool Erstellen mit kaum Wissen Java Basics - Anfänger-Themen 9
S Substring in java Java Basics - Anfänger-Themen 3
Z Operatoren Java Applikation Java Basics - Anfänger-Themen 8
Tw1Z Erste Schritte Sort in java Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben