Text Datei einlesen und übertragen

Bitte aktiviere JavaScript!
Guten Tag zusammen,

ich brauche Hilfe beim verstehen einer Aufgabe. Und zwar soll ich ein Programm schreiben das Argumente entgegenimmt, die einen Pfad zu einer Textdatei geben soll, diese soll dann verschlüsselt werden, und in einen Zielpfad kommen. (Verschlüsselung wird über Ceasar alg. laufen) (Aber soweit bin ich noch nicht) Ich möchte jetzt erst mal verstehen wie ich eine Textdatei von einem Pfad in einen anderen übertrage. Außerdem soll noch eine zahl zwischen 0 und 25 entgegen genommen werden für die verschiebung( schätze das hat aber was mit der verschlüsselung zu tun).

hier schon einmal kleiner anfang

Code:
import java.io.*;

public class InterneKommunikation {

    public static void main(String[] args) throws IOException {
        File datei = new File("c:\\Uebung_Java\\fileTest.txt");
        FileReader eingabeStrom = new FileReader(datei);
        BufferedReader eingabe = new BufferedReader(eingabeStrom);
        
    }

}
Soweit ich das verstanden habe sollte das so in etwa gehen können. Sprich ich speichere die Text datei in einer Variable, am besten schreibe ich jetzt eine Methode, in der ich die Variable übergebe diese dann verschlüsse und in einem neuen Pfad zurückgebe?

Danke im vorraus.

Herzliche Grüße
 
Also generelle Herangehensweise ist aus meiner Sicht:
Ist es notwendig, die ganze Datei auf einmal zu lesen? Das kann halt bei großen Dateien problematisch sein...

Die Verschlüsselung ist aber Zeichen basiert, d.h. ein Zeichen wird durch ein anderes ersetzt. (https://de.wikipedia.org/wiki/Caesar-Verschlüsselung) Also besteht keine Notwendigkeit, die Datei als ganzes einzulesen. Der Übliche Weg ist also etwas wie:
- Öffne die Source Datei zum Lesen
- Öffne die Ziel Datei zum Schreiben
- Solange Du eine Zeile lesen kannst:
---> Verschlüssel die Zeile
---> Schreibe das Ergebnis der Verschlüsselung in die Ziel Datei
- Schließe beide Dateien.
 
Danke für deine Antwort! Leider verstehe ich noch nicht wie ich die Source Datei lese, und dann eine Ziel Datei öffne. Da werde ich mich nochmal einlesen müssen, es fällt mir schwer zu entscheiden was man dann für schlüssewörter benutzt.

Ergänzung:

Code:
FileReader fr = new FileReader("c:\\Uebung_Java\\fileTest.txt");
        BufferedReader br = new BufferedReader(fr);
        
        String ausgabe = br.readLine();
        System.out.println(ausgabe);
So kann ich mir den Text aus der Datei ausgeben lassen.
 
Du hast den Code doch schon fast fertig. Du hast den BufferedReader auf einem FileReader erzeugt zum öffnen der Datei:
Java:
    FileReader fileReader = new FileReader("infile.txt");
    BufferedReader reader = new BufferedReader(fileReader);
#

Zum Schreiben ist fast das Gleiche, nur eben wird "Reader" durch "Writer" ersetzt...

Das lesen von Zeilen kannst Du nun über reader.readLine() machen. Dieser Aufruf gibt am Ende null aus, so dass wird dies prüfen. Lesen (mit Zuweisung in eine Variable) kann nun über etwas wie folgt gemacht werden:
Java:
String line;
while ((line = reader.readLine()) != null) {
  // Do something ...
}
Das Du Something ist dann halt das verschlüsseln der Zeile sowie das schreiben in den BufferedWriter.

Und nach der Schleife werden die BufferedReader/BufferedWriter noch geschlossen mit close() Aufrufen.
 
Ja und wenn ich das so mache dann gehe ich auch in einen Pfad der verschlüsselt werden soll? In einen Zielpfad wo die verschlüsselete datei dann sein soll?
Code:
public static void main(String[] args) throws IOException {
       
        FileReader filereader = new FileReader("c:\\Uebung_Java\\fileTest.txt");
        BufferedReader reader = new BufferedReader(filereader);
       
       
        FileWriter filewriter = new FileWriter("c:\\Uebung_Java\\fileTest.txt");
        BufferedReader writer = new BufferedReader(filerwriter);
       
   
        String linie;
        while(linie = reader.readLine() != null) {
           
            //Abfrage um wieviele Stellen verschoben werden soll 0-25
           
            //Cäsar verschlüsselung
           
        }
       
        //Ausgabe der Verschlüsselung
        //Reader und Writer schließen
   
    }
Wäre der Aufbau Korrekt?
 
Nein, der Aufbau ist nicht ganz korrekt. Folgende Dinge fallen mir auf:
- Ein- und Ausgabe sollten natürlich unterschiedliche Dateien sein. So wird es nicht funktionieren, da die Datei ja erst zum Lesen geöffnet wird und dann kann man die Datei nicht mehr zum Schreiben öffnen, da durch das Öffnen zum Lesen das Betriebssystem die Datei sperrt.
- Die Abfrage, um wie viele Stellen verschoben werden soll, muss einmalig vor der Schleife erfolgen. Du willst ja nicht für jede Zeile einen neuen Wert eingeben.
 
Nein, der Aufbau ist nicht ganz korrekt. Folgende Dinge fallen mir auf:
- Ein- und Ausgabe sollten natürlich unterschiedliche Dateien sein. So wird es nicht funktionieren, da die Datei ja erst zum Lesen geöffnet wird und dann kann man die Datei nicht mehr zum Schreiben öffnen, da durch das Öffnen zum Lesen das Betriebssystem die Datei sperrt.
- Die Abfrage, um wie viele Stellen verschoben werden soll, muss einmalig vor der Schleife erfolgen. Du willst ja nicht für jede Zeile einen neuen Wert eingeben.
Danke für die Antwort! Ich bin mir gerade nicht 100% Sicher ob wir dasselbe meinen :eek: . Und zwar möchte ich ja eine Datei vom Desktop z.b. irgendein Textdokument, dort steht z.b. drin "Hallo Wie gehts" und diese Datei soll verschlüsselt werden und in einem Zielpfad gespeichert werden.
 
Ja genau. Das habe ich ja schon verstanden. Aber den Aufbau hast Du noch nicht ganz verstanden fürchte ich.

Aber Du kannst es ja mal ausprobieren. Du kannst ja auf das Verschlüsseln noch verzichten indem Du einfach eine Funktion schreibst, die den String unverschlüsselt zurück gibt.

Und dann testest Du es aber bitte mit einer Datei mit mehr als einer Zeile, also z.B. eine Datei wie:
Dies ist Zeile 1.
Und noch eine zweite Zeile!

Und dann schaust du einfach, was passiert und ob es genau das ist, was du haben möchtest.
 
Ja genau. Das habe ich ja schon verstanden. Aber den Aufbau hast Du noch nicht ganz verstanden fürchte ich.

Aber Du kannst es ja mal ausprobieren. Du kannst ja auf das Verschlüsseln noch verzichten indem Du einfach eine Funktion schreibst, die den String unverschlüsselt zurück gibt.

Und dann testest Du es aber bitte mit einer Datei mit mehr als einer Zeile, also z.B. eine Datei wie:
Dies ist Zeile 1.
Und noch eine zweite Zeile!

Und dann schaust du einfach, was passiert und ob es genau das ist, was du haben möchtest.
Ok habe ich jetzt gemacht:

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

        FileReader fileReader = new FileReader("C:\\Uebung_Java\\fileTest.txt");
        BufferedReader reader = new BufferedReader(fileReader);
        
        //Deklaration
        textLesen(fileReader, reader);
        
    }

    // Methoden
    
    public static String textLesen(FileReader fileReader, BufferedReader reader) throws IOException {
        
        String line;
        
        while((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        return line;
    
    }
Wie speichere ich das dann in einem Ziel Pfad? Ich denke mal in der Methode "textLesen" könnte ich das Verschlüsseln noch mit reinpacken. Zumindest das er das Verschlüsselte zurückgibt.
 
Also die Funktion textLesen wird immer null zurück geben, das ist Dir klar?

Die Idee, die ich ursprünglich aufgebracht habe, war ja: Zum verschlüsseln lädst Du die Datei immer nur Zeile für Zeile und verarbeitest dann die Zeile direkt in der while Schleife.

Aber falls Du das nicht mehr so machen willst, dann kannst Du natürlich auch umsatteln und die immer eine Datei komplett lesen und zurück geben. Aber dann funktioniert es ggf. nicht mehr für große Dateien.
 
Also die Funktion textLesen wird immer null zurück geben, das ist Dir klar?

Die Idee, die ich ursprünglich aufgebracht habe, war ja: Zum verschlüsseln lädst Du die Datei immer nur Zeile für Zeile und verarbeitest dann die Zeile direkt in der while Schleife.

Aber falls Du das nicht mehr so machen willst, dann kannst Du natürlich auch umsatteln und die immer eine Datei komplett lesen und zurück geben. Aber dann funktioniert es ggf. nicht mehr für große Dateien.
Warum wird Sie immer Null zurückgeben? Bei mir ist die Ausgabe das was in der Textdatei steht. Was meinen Sie genau damit ? :)

Ok dann müssen wir Ihre Idee nehmen denn meine Aufgabenstellung besagt das "man mit beliebig großen Dateien umgehen können soll und wenn bereits eine Datei im Zielpfad exisitert soll Sie ersetzt werden"

Also wieder von Anfang..
Also ich möchte eine Methode der ich die Textdatei übergebe diese dann Zeile um Zeile verarbeitet oder wie? Und diese Zeile gebe ich in eine While schleife in der es verschlüsselt wird und dieses "verschlüsselte" gebe ich dann zurück und speicher es in einem neuen Pfad?
 
Also die Funktion gibt mit System.out.println Zeile für Zeile aus.
Wenn line null ist, wird die While-Schleife verlassen und line als Rückgabewert zurück gegeben.

Du siehst nur die Ausgabe, denn Du rufst die Funktion ja auf, ohne mit dem Rückgabewert irgendwas zu machen.

Und in #4 hast Du ja schon fast alles. Du musst da, wo die Datei zum Lesen geöffnet wird nur noch eine Datei zum schreiben öffnen. Und der Do Something Kommentar muss ersetzt werden mit dem Verschlüsseln der Zeile und dem Schreiben des Strings in der Zieldatei.
 
Also die Funktion gibt mit System.out.println Zeile für Zeile aus.
Wenn line null ist, wird die While-Schleife verlassen und line als Rückgabewert zurück gegeben.

Du siehst nur die Ausgabe, denn Du rufst die Funktion ja auf, ohne mit dem Rückgabewert irgendwas zu machen.

Und in #4 hast Du ja schon fast alles. Du musst da, wo die Datei zum Lesen geöffnet wird nur noch eine Datei zum schreiben öffnen. Und der Do Something Kommentar muss ersetzt werden mit dem Verschlüsseln der Zeile und dem Schreiben des Strings in der Zieldatei.
Danke für deine Hilfe.

Ich habe es jetzt weiter versucht, komme aber nicht drauf wie ich den Writer richtig verwende, habe jetzt erstmal einfach nur verschlüsselt irgendwie. Aber ist auf jeden Fall immer noch falsch.

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

        FileReader fileReader = new FileReader("c:\\Uebung_Java\\startDatei.txt");
        BufferedReader reader = new BufferedReader(fileReader);

        FileWriter fileWriter = new FileWriter("c:\\Uebung_Java\\zielDatei.txt");
        BufferedWriter writer = new BufferedWriter(fileWriter);

        String zeile;
        String zielZeile = "";
        String zielDateiString = "";

        while ((zeile = reader.readLine()) != null) {
            for(int i = 0; i <= zeile.length(); i++) {
                char tmp = zeile.charAt(i);
                zielDateiString += (char) (tmp + 3);
                zielZeile = zielDateiString;
            }
        }
        System.out.println(zielZeile);
        
    }
 
Du hast ja schon einen BufferedWriter erstellt. Daher könnte man sich die Klasse einmal ansehen, was man da so aufrufen kann:

Da dürfte write(String s, int off, int len) zielführend sein. Und newLine() könnte man nutzen um einen Zeilenumbruch zu schreiben.

Bezüglich der Verschlüsselung sehe ich zwei Dinge als wichtig an:
a) Wenn es zu einet Art "Overflow" kommt durch die + Operation, dann geht es von vorne los. Also nach "Z" kommt wieder "A".
b) Wenn Zeichen vorkommen, die nicht im Alphabet definiert sind, dan müsste man überlegen was man da dann ausgibt. Da die Menge der erlaubten Zeichen auf die Menge der erlaubten Zeichen abgebildet wird, könnte man hier die "ungültigen" Zeichen einfach 1:1 weitergeben.
 
Du hast ja schon einen BufferedWriter erstellt. Daher könnte man sich die Klasse einmal ansehen, was man da so aufrufen kann:

Da dürfte write(String s, int off, int len) zielführend sein. Und newLine() könnte man nutzen um einen Zeilenumbruch zu schreiben.

Bezüglich der Verschlüsselung sehe ich zwei Dinge als wichtig an:
a) Wenn es zu einet Art "Overflow" kommt durch die + Operation, dann geht es von vorne los. Also nach "Z" kommt wieder "A".
b) Wenn Zeichen vorkommen, die nicht im Alphabet definiert sind, dan müsste man überlegen was man da dann ausgibt. Da die Menge der erlaubten Zeichen auf die Menge der erlaubten Zeichen abgebildet wird, könnte man hier die "ungültigen" Zeichen einfach 1:1 weitergeben.
Vielen Dank für deine Hilfe! Aber ich bin noch so neu in dem Gebiet das ich es teilweise echt nicht verstehe was ich da machen soll. Ich denke ich werde erst einmal mich nochmal gescheit einlesen in das Thema.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben