Seltsame Dateiauslesung

Feeder

Bekanntes Mitglied
Java:
package datareading;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DataReading {
    Scanner s;
    FileWriter out;
    File f;
    String st = "";
    public DataReading() throws FileNotFoundException, IOException{
        try {
            f = new File(this.getClass().getResource("reader.txt").toURI());
            s = new Scanner(f);
        } catch (URISyntaxException ex) {
            Logger.getLogger(DataReading.class.getName()).log(Level.SEVERE, null, ex);
        }
        while(s.hasNext()){
        System.out.println("(" + s.nextInt() + " " + s.nextInt() + " " + s.nextInt() + ")");
        }
        s.reset();
        out = new FileWriter(f);
        while(s.hasNext()){
            st = st + "\n" + s.nextLine();
         }
        out.write(st + " \n" + " 0 0 0");
        out.close();
    
        }
public static void main(String[] args) throws FileNotFoundException, IOException {
        new DataReading();
             }
       }

Hey,

Ich beginne gerade mich mit Dateien und ihrer Auslesung zu befassen. Ich möchte mir später eine kleine Datei anlegen, die Vektoren (In Form von 3 doubles) speichern kann. Damit - und etwas mit Mathe - möchte ich versuchen eine kleine KI zu programmieren.

Bei dieser Datei läuft etwas aber nicht ganz korrekt ab. Ich habe neben der Klasse mir einen Textdatei(reader.txt) erstellt. Diese besitzt pro Zeile 3 Integers.
Nun möchte ich später intelligent Code hinzufügen. Da ich nicht weiß, wie man einzelne Zeilen beschreiben kann und dazu auch nichts fand, wollte ich zunächst den ganzen Text auslesen und dann mit zusätzlichen Text wieder einschreiben.

Nun mein Problem: Der Code soll eigentlich den ursprünglichen Text und eine neue Zeile mit Text " 0 0 2" hinzufügen.

Bei einem 2. Ausführen des Programm liest der Scanner jedoch nur 0 0 2 aus.
Ein anderes Programm wie der "Editor" zeigt aber danach den gesamten ursprünglichen Text an, nicht aber "0 0 2".

WTF WARUM ????

Kann mir jemand mächtigere Klassen (oder Bibliotheken nennen) die mir das Beschreiben einzelner Zeilen und speichern vereinfachen, sowie Auslesungen (in jeweiligen Zeilen) ermöglichen?

Ich stelle mir sowas vor:

getString(int zeile)
getInt(int zeile)
getInt(int nter_char)


Wie kann ich mir Dateien erstellen, die Matrizen enthalten und ich nur den jeweiligen Vektor (1. , 2. , 3., ..., n.) auslesen muss?


Danke für die Hilfe !!!

EDIT: Mir ist gerade in der Beschreibung der Zeilen ein Fehler aufgefallen. Es war allerdings nicht ausschlaggebend. Das Problem besteht weiterhin!
 
Zuletzt bearbeitet:

Hash4cash

Neues Mitglied
Hi,

Dies ist mein erster Beitrag.
Ich tipp das ganze aufm smartphone und bin grad nicht am pc desweiteren kenne ich die Scannerklasse leider auch nicht.
Trotzdem versuch ichs mal.

- Wieso machst du die Loop 2x ?
- meiner meinung nach, schreibt das programm als einziges 0 0 0 in die txt.
So spontan bin ich überrascht, dass der eigentliche Inhalt nicht überschrieben wird.

Aber aus meiner sicht, sollte der writer in jeder while has next eine zeile schreiben.
Ich würde dies evtl sowieso eher alles zuerst auslesen, das ganze in ein array speichern und alles nochmals ausgeben.
 

AndyJ

Bekanntes Mitglied
Howdy,

das Ganze geht auch viel einfacher, wenn man die java.nio.file.Files Klasse verwendet:

Java:
package info.junius.test;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Arrays;
import java.util.List;

public class AI {

 public static void main(String[] args) throws IOException {  
  Path pathToFile = FileSystems.getDefault().getPath("reader.txt");
  // read the file and create matrix  
  List<String> lines = Files.readAllLines(pathToFile);
  int[][] matrix = new int[lines.size()][];
  for(int i = 0; i < lines.size(); ++i) {   
   matrix[i] = parse(lines.get(i));
  }  
  System.out.println(Arrays.deepToString(matrix));
  // do something with the matrix...
  // ...
  // save matrix back to file or append only the new lines
  List<String> linesChanged = Arrays.asList(new String[]{"3 3 3", "4 4 4"});
  // then save it
  Files.write(pathToFile, linesChanged, StandardCharsets.UTF_8, StandardOpenOption.APPEND);
 }
 
 private static int[] parse(String line) {
  String[] values = line.split(" ");
  int[] result = new int[values.length];
  for(int i = 0; i < values.length; ++i) {
   result[i] = Integer.parseInt(values[i]);
  }  
  return result;
 }
 
}

Cheers,
Andy
 

Feeder

Bekanntes Mitglied
Hey Andy,

vielen Danke für die Hilfe. Probiere ich sofort auf.
Soweit ich weiß muss ich, doch aber für:

Object[] = new Object[n] (new Object[])
n definieren? Dann müsste ich doch auch für
Object[][] = new Object[n][n2]
n2 definieren?

EDIT: Er schreibt mir den String trotzdem nicht ein... Es bleibt bei dem Ursprungstext, 3 3 3 4 4 4 schreibt er aber nicht ein :(
 
Zuletzt bearbeitet:

Feeder

Bekanntes Mitglied
Hi,

Dies ist mein erster Beitrag.
Ich tipp das ganze aufm smartphone und bin grad nicht am pc desweiteren kenne ich die Scannerklasse leider auch nicht.
Trotzdem versuch ichs mal.

- Wieso machst du die Loop 2x ?
- meiner meinung nach, schreibt das programm als einziges 0 0 0 in die txt.
So spontan bin ich überrascht, dass der eigentliche Inhalt nicht überschrieben wird.

Aber aus meiner sicht, sollte der writer in jeder while has next eine zeile schreiben.
Ich würde dies evtl sowieso eher alles zuerst auslesen, das ganze in ein array speichern und alles nochmals ausgeben.
Also wie Andy, quasi ?
 

Feeder

Bekanntes Mitglied
Und jetzt heult er mir komplett rum...
Wirft bei dei Andys Code: java.nio.NoSuchFileException, obwohl ja die Datei daneben liegt...
 

Feeder

Bekanntes Mitglied
Java:
package ai.datareading;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Arrays;
import java.util.List;

public class DataReading {

public static void main(String[] args) throws IOException { 
  Path pathToFile = FileSystems.getDefault().getPath("reader.txt");
  if(!pathToFile.toFile().exists()) {
      Files.createFile(pathToFile);
  }
  // read the file and create matrix 
  List<String> lines = Files.readAllLines(pathToFile);
  int[][] matrix = new int[lines.size()][];
  for(int i = 0; i < lines.size(); ++i) {  
   matrix[i] = parse(lines.get(i));
  } 
  System.out.println(Arrays.deepToString(matrix));
  // do something with the matrix...
  // ...
  // save matrix back to file or append only the new lines
  List<String> linesChanged = Arrays.asList(new String[]{"3 3 3", "4 4 4"});
  // then save it
  Files.write(pathToFile, linesChanged, StandardCharsets.UTF_8, StandardOpenOption.APPEND);
}
private static int[] parse(String line) {
  String[] values = line.split(" ");
  int[] result = new int[values.length];
  for(int i = 0; i < values.length; ++i) {
   result[i] = Integer.parseInt(values[i]);
  } 
  return result;
}
}

Dieser Code funktioniert!!!
Anscheinend erkennt er die von anderen Programmen erstellte "reader.txt" nicht an.
Ebenso findet sich die Datei nicht in meinen Ordner. Wie kann ich das beheben?
 

VfL_Freak

Top Contributor

Feeder

Bekanntes Mitglied
Moin,

Was soll das bedeuten ('nicht anerkennen') ??
Was für Dateien hast Du dennmit welchen Programm erstellt ??


In welchen Ordner liegt sie denn ??
ggf. den Pfad anpassen ??

VG Klaus

Ich lege die "reader.txt" neben meiner Main-Klasse ab, so dass ich sie beliebig in .jars exportien könnte.
Wenn ich in diesem Ordner eine txt-Datei mit dem "Editor" speichere, existiert dort eine Datei, die von meinen programm nicht gelesen werden kann(er findet sie nicht). Befehle ich jedoch meinen Script die Datei zu erstellen, scheint es diese tatsächlich irgendwo zu speichern, da es nie nach Neustart des Scripts wieder aufrufen kann. In dem Ordner ist die Datei jedoch nicht zufinden, sie existiert im selben Ordner mit gleichnamigen Namen parrallel zur vom Editor erstellten Datei... Das ist eigenartig
 

JStein52

Top Contributor
Befehle ich jedoch meinen Script die Datei zu erstellen, scheint es diese tatsächlich irgendwo zu speichern, da es nie nach Neustart des Scripts wieder aufrufen kann. In dem Ordner ist die Datei jedoch nicht zufinden, sie existiert im selben Ordner mit gleichnamigen Namen

Sorry, ich verstehe kein Wort. Speichert er sie "irgendwo" und du weisst nicht wo ? Dann schreibst du wieder sie existiert im selben Ordner ? Was ist der selbe Ordner ? Vielleicht schreibst du mal genau auf wann welche Datei in welchem Ordner existiert ...
 

Feeder

Bekanntes Mitglied
Sorry, ich verstehe kein Wort. Speichert er sie "irgendwo" und du weisst nicht wo ? Dann schreibst du wieder sie existiert im selben Ordner ? Was ist der selbe Ordner ? Vielleicht schreibst du mal genau auf wann welche Datei in welchem Ordner existiert ...

Lege main.class in Ordner A ab.
Schreibe mit Editor file.name und speichere es im Ordner A ab.
main.class sucht nach Ausführung file.name im Ordner A.
main.class findet file.name im Ordner A nicht.
main.class erstellt file.name im Ordner A.
Jetzt existieren 2x file.name im Ordner A.
Editor findet von main.class erstelltes file.name nicht.
Ebenso sind die Inhalte beider file.name unterschiedlich.
Das von main.class erstellte Fail existiert nur für main.class.

*Brain FucK*
 

DrZoidberg

Top Contributor
Mach das ganze mal auf der Konsole (also kompilieren, laufen lassen und dann per "dir" und "more" Befehl die erzeugten Dateien anzeigen). Dann kannst du den gesamten Text aus der Konsole kopieren und hier posten.
 

Feeder

Bekanntes Mitglied
Fehler von mir, Datei gefunden. Hatte den Speicherort der Dateien falsch in Errinierung. tml

Leider erklärt das noch nicht, wie ich am Ende einer Datei Text anhängen kann und wie ich in beliebiger Zeile auslesen kann.
 

Feeder

Bekanntes Mitglied
Aber du hast doch schon Code gepostet, der genau das macht.
Meinst du den obersten? Der geht leider nicht.

Ebenso wie er mir hier die Arbeit verweigert. "\n" wird als Zeilenumbruch nicht gespeichert.

Java:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;


public class AIFilewriter {

    File f;
    Scanner s;
    FileWriter fw;
    public AIFilewriter() {
        try {
            f = new File("data.txt");
            if(!f.exists()) {
                f.createNewFile();
                fw = new FileWriter(f);
                fw.write("Edited" + "\n" + "Edited");
                fw.flush(); // Muss das rein?
                fw.close();
            } else {
            fw = new FileWriter(f);
            s = new Scanner(f);
            String g = s.nextLine();
            while(s.hasNextLine()) {
                g = g + s.nextLine() + "\n";
                System.out.println("Here");
            }
            fw.write(g + "Edited");
            fw.flush(); // Muss das rein?
            fw.close();
      
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
  
        }

    public static void main(String[] args) {
        new AIFilewriter();

    }

}

Ich meine es muss doch auch ohne ein Array/List gehen, oder?
 
Zuletzt bearbeitet:

Feeder

Bekanntes Mitglied
Ich stell meine Frage einfach mal anders.
Wie ich schreibe ich in die n-te Zeile einer Datei ohne dabei die anderen Zeilen zu verändern?
 

Meniskusschaden

Top Contributor
Allerdings müsste das Programm eigentlich abstürzen, weil bei s.nextLine()nicht geprüft wird, ob es überhaupt eine Zeile gibt. Und da die Datei in der Anweisung davor überschrieben wird, stehen die Chancen dafür ziemlich schlecht.
 

DrZoidberg

Top Contributor
Ich habe deinen Code mal etwas verändert. Ich beende erst die Leseoperation vollständig bevor ich mit dem schreiben anfange. Ausserdem öffne ich die Datei im append mode um Zeilen anzufügen.

Java:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class AIFilewriter {
    public AIFilewriter() {
        try {
            File f = new File("data.txt");
            if(!f.exists()) {
                f.createNewFile();
                FileWriter fw = new FileWriter(f);
                fw.write("Edited" + "\n" + "Edited");
                fw.close();
            } else {
                Scanner s = new Scanner(f);
                String g = "";
                while(s.hasNextLine()) {
                    g = g + "\n" + s.nextLine();
                }
                s.close();
              
                FileWriter fw = new FileWriter(f, true);
                fw.write(g + "\nEdited");
                fw.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new AIFilewriter();
    }
}
 

Feeder

Bekanntes Mitglied
Allerdings müsste das Programm eigentlich abstürzen, weil bei s.nextLine()nicht geprüft wird, ob es überhaupt eine Zeile gibt. Und da die Datei in der Anweisung davor überschrieben wird, stehen die Chancen dafür ziemlich schlecht.
Tut es auch :D Allerdings versteh ich nicht warum, weil ja 1 Zeile definitv da steht.

Ich stell meine Frage einfach mal anders.
Wie ich schreibe ich in die n-te Zeile einer Datei ohne dabei die anderen Zeilen zu verändern?
 

Meniskusschaden

Top Contributor
Allerdings versteh ich nicht warum, weil ja 1 Zeile definitv da steht.
Habe ich doch schon geschrieben:
Und da die Datei in der Anweisung davor überschrieben wird, stehen die Chancen dafür ziemlich schlecht.
Ist egal, was vorher in der Datei stand. Du überschreibst sie, bevor du sie liest.
Wie ich schreibe ich in die n-te Zeile einer Datei ohne dabei die anderen Zeilen zu verändern?
Dazu gab es in den letzten Posts doch schon reichlich Antworten: Append-Modus oder wahlfreier Zugriff.
 

Feeder

Bekanntes Mitglied
Okay habe jetzt alles soweit verstanden bis auf das mit der nten Zeile :confused:.
Könnte mir dort jemand bitte nocheinmal den Befehl rezitieren ;)
 

Meniskusschaden

Top Contributor
Ich glaube nicht, dass es einen einzelnen Befehl dafür gibt. Es sind ja nicht alle Zeilen gleich lang. Deshalb kann man nicht einfach eine beispielsweise 20 Zeichen lange Zeile durch eine 30 Zeichen lange Zeile ersetzen. Es läuft also letztendlich darauf hinaus, dass man ab der geänderten Zeile auch alle übrigen wieder anhängen muß.
Am einfachsten ist es wahrscheinlich, die gesamte Datei z.B. in eine ArrayList einzulesen, Änderungen dort vorzunehmen und sie dann wieder zu speichern. Wenn du es für deinen Anwendungsfall benötigst, kannst du dir ja auch eine eigene Methode write(int lineNumber, String text);programmieren, die das für dich erledigt. Dann müsstest du dir natürlich auch überlegen, was passieren soll, wenn du z.B. write(10, "Zeile 10");für eine Datei aufrufst, die nur fünf Zeilen hat. Exception werfen oder entsprechend viele Leerzeilen einfügen?
 

Ähnliche Java Themen

Neue Themen


Oben