Java Streams - Aufgabe richtig gelöst?

b1gsh0w

Cadet 4th Year
Registriert
Mai 2009
Beiträge
91
Hallo,

bin grad dabei eine Aufgabe zu Streams zu lösen. Leider verwirrt mich die Formulierung. Die Aufgabe lautet wie folgt:

Implementieren Sie einen Stream Kodierer, der Character-
Ausgabe-Streams kodiert. Die einzelnen Zeichen werden in diesem Stream
durch eine Kodierungsmethode verändert. Dazu wird ein Schlüssel verwendet,
der im Konstruktor angegeben wird. Die Verschlüsselungsmethode
multipliziert den ASCI-Wert jedes Zeichens mit dem Schlüssel und führt auf
das Ergebnis die Funktion Modulo 123 aus. Der so errechnete Wert wird vom
Stream ausgegeben. Ihr Klasse sollte folgende Methoden zur Verfügung
stellen:

i. public Kodierer(java.io.Writer w, int
schluessel): Konstruktor, das Kodierer-Objekt leitet seine
Eingaben an die Ausgabe w weiter.
ii. public void schreibe(int c) : Schreiben eines Characters
(in ASCII-Code) in den Stream. Dieser Wert wird kodiert in den
Ausgabe-Strom w, der im Konstruktor definiert wurde,
geschrieben
iii. private int kodiere (int c): liefert die Kodierung von c

Mein Code sieht so aus:

Code:
package Streams;

import java.io.IOException;
import java.io.Writer;

public class Kodierer {
    
    Writer w;
    int schluessel;
    
    public Kodierer(Writer w, int schluessel){
        this.w = w;
        this.schluessel = schluessel;
    }
    
    public void schreibe(int c) throws IOException{
        kodiere(c);
        w.write(c);
    }

    private int kodiere(int c){
        return (this.schluessel*c) % 123;
    }
}

Habe ich eurer Meinung die Aufgabe gelöst, oder fehlt da noch was? (Hab leider keine Lösung dazu).

Gruß
 
Ich kann da beim besten Willen nichts erkennen, was noch fehlen würde :)
 
nicht ganz. in der MEthode "schreibe" rufst du die Methode kodiere auf, die einen Wert returnt. der wert wird jedoch nicht zugewießen. w.write(kodiere(c)); sollte es tun. Ich schau dann mal weiter drüber
 
Code:
    Writer w;
    int schluessel;

Ich würde die Instanzvariablen noch private machen.

Code:
    public void schreibe(int c) throws IOException{
        kodiere(c);
        w.write(c);
    }

Das dürfte so nicht funktionieren. Du willst doch eigentlich nicht c in den Writer schreiben, sondern das kodierte c.
 
Ich hab doch einen Fehler gefunden.
Code:
    public void schreibe(int c) throws IOException{
        kodiere(c); // Du kodierst hier zwar "c"...
        w.write(c); // doch schreibst du hier wieder den nicht kodierten Wert in den Stream.
    }

So sollte das aussehen:
Code:
    public void schreibe(int c) throws IOException{
        int kodiert = kodiere(c);
        w.write(kodiert);
    }

Edit: Zu spät. :(
 
@TheCadillacMan: zzzz. Immer diese Speicherverschwender :D :D :D
deine zusätzliche lokale Variable kodiert ist eigentlich unnötig. das direkte reinschreiben geht auch. das spar Speicher du handelst dir weniger potientielle Fehler ein.
 
@skynet: Wenn das "echter" Code gewesen wäre, hätte ich mir die Variable auch gespart. Mir gings hier nur darum den Fehler und die Lösung möglichst deutlich zu machen.
Abgesehen davon finde ich, dass das Wort "Verschwendung" bei 4 Byte etwas übertrieben ist. ;)
 
Hab das jetzt mal mit ner Main-Methode testen wollen, hat aber leider nicht funktioniert. Hab nen FileWriter genommen. Die Datei wird zwar erstellt, der Inhalt fehlt aber.
 
Wie gesagt, das offentsichtliche überseh ich gern. Danke.
Hab mir noch ne close() Methode gebaut, die die close() Methode vom writer aufruft.
Funktioniert jetzt.
 
Zuletzt bearbeitet:
TheCadillacMan schrieb:
@skynet: Wenn das "echter" Code gewesen wäre, hätte ich mir die Variable auch gespart. Mir gings hier nur darum den Fehler und die Lösung möglichst deutlich zu machen.
Abgesehen davon finde ich, dass das Wort "Verschwendung" bei 4 Byte etwas übertrieben ist. ;)

In manchen Fällen kann es aber auch die Lesbarkeit erhöhen. Was den Speicherplatz betrifft, würde es mich wundern wenn sowas nicht vom Compiler wieder wegoptimiert würde.
 
Damit das funktioniert brauchst du afaik einen buffered Writer:

Code:
import java.io.*;

class FileWriter {

   public static void schreibe(int c){
      try{

        // Der File wird erzeugt.
        FileWriter fstream = new FileWriter("out.txt");
        BufferedWriter out = new BufferedWriter(fstream);

        out.write(kodiere(c));
    
        //Danach muss der Stream geschlossen werden.
        out.close();

        }catch (Exception e){
            e.printStackTrace;    
        }
    }
}

Damit kannst du deine Ausgabe in eine Datei schreiben.
 
Poste davon mal den Code.
Wahrscheinlich hast du nur vergessen, den Writer mit .close() wieder zu schließen.

Edit: Ja lol da war ich aber arg zu langsam. Ich sollte die Tabs nicht immer so lange offen lassen, ohne sie zu refreshen^^

Gruß Timo
 
b1gsh0w schrieb:
Wie gesagt, das offentsichtliche überseh ich gern. Danke.
Hab mir noch ne close() Methode gebaut, die die close() Methode vom writer aufruft.
Funktioniert jetzt.

Eigentlich gehört die Methode nicht in Kodierer hinein, da das nicht Teil seiner Funktionalität ist.

Ich würde close außerhalb auf den Writer aufrufen. Falls er noch nicht geschlossen werden soll, sorgt übrigens flush() dafür, dass der Puffer geschrieben wird. Das "hässliche" an close() ist, dass es endgültig ist.

Solche Aufrufe die Ressourcen freigeben sind übrigens am besten im finally block aufgehoben, da sie dann auch bei einer Exception ausgeführt werden.
 

Ähnliche Themen

Antworten
7
Aufrufe
1.404
Green Mamba
G
Zurück
Oben