Daten in textdateien ...



  • Hallo,

    ich hab hier eine Programm das alle 5 minuten in eine Textdatei einen wert einträgt aus mehreren Zahlen. Nun soll das auf einem LED Laufband ausgegebenw erden und dieses hat ebenfalsl ein programm, das eine Textdatei benutzt in dem die betreffende Zeile eingetragen sein muß aber eben immer nur eine nicht mehrere.

    Jetzt dachte ich, das man mit Java sicher eine kleine routine schreiben kann die aus der ersten TXT einfach die letzte Zeile entnimmt und diese in die andere TXT überträgt, bzw. die alte Display TXT ersetzt.

    Da ich aber noch nicht lange mit Java arbeite suche ich eine anregung oder eben hinweise wie man sowas machen könnte.

    mfg



  • ich habs jetzt geschafft das eine bestehende textdatei ausgelesen wird und das ergebnis auf dem bildschirm erscheint ...

    das problem ist jetzt, ich möchte das immer nur die letzte zeile der datei ausgelesen wird, wie macht man sowas?

    Später soll diese Zeile dann in eine andere datei geschreiben werden, bzw. einfach die vorhandene datei ersetzt werden.

    import java.io.*;
    
    public class TextFileReader {
    public static void main(String[] args){
    try{
    BufferedReader br =
      new BufferedReader(new FileReader("Daten.txt"));
    
    String zeile = br.readLine();
    while (zeile != null) {
      System.out.println(zeile);
      zeile = br.readLine();
    }
    }catch(IOException ioe){
    ioe.printStackTrace();
    }
    }
    }
    


  • Am Ende deiner while-Schleife steht die letzte Zeile deiner Datei in deiner Variable 'zeile'. Damit hast du es doch ...



  • hm, aber wenn das programm läuft gibt es mir allezeilen aus nacheinander... oder wie ist das gemeint?



  • import java.io.*;
    
    public class TextFileReader {
    public static void main(String[] args){
    try{
    BufferedReader br =
      new BufferedReader(new FileReader("Daten.txt"));
    
    String zeile = br.readLine();
    while (zeile != null) {
      System.out.println(zeile);
      zeile = br.readLine();
    }
    
    // neu
    System.out.println("Das ist die letzte Zeile: " + zeile);
    
    }catch(IOException ioe){
    ioe.printStackTrace();
    }
    }
    }
    

    Lass das mal laufen, dann siehst du, dass du Programm-intern in 'zeile' die letzte Zeile deiner Datei gespeichert hast. Was du jetzt weiterhin damit machst, ist deine Sache.



  • also da schr3eibt er als ausgabe wert "null" also nehm ich mal an das der buffer irgendwie geleert wurde oder so ...

    in der beispiel TXT ist nur eine zahlen folge 1-10 die untereinader steht...

    könnte man vielleicht auch sowas amchen, das der bis zum ende der datei geht und dann einfach ein zeichen zurück und das ließt? Dann hätte ich doch die letzte zeile ...



  • Auf die Schnelle:

    String zeile, letzteZeile = null;
    while ( (zeile = br.readLine()) != null) {
      letzteZeile = zeile;
      System.out.println(zeile);
    }
    
    System.out.println("Das ist die letzte Zeile: " + letzteZeile);
    

    Und wenn man von hinten beginnt zu suchen, dann so (bestimmt nicht einfach für einen Java-Anfänger):

    File datenDatei = new File("Daten.txt");
         RandomAccessFile in = new RandomAccessFile(datenDatei, "r");
    
         //springe bis zum Ende
         in.skipBytes( (int)(in.length()-1) );
    
         //hole Umbruchzeichenkette
         String sep = System.getProperty("line.separator");
         //Länge des Umbruchs (in Windows 2 Zeichen)
         int sepLaenge = sep.length();
         //Puffer
         byte[] b = new byte[sepLaenge];
         String letzteZeile = null;
    
         //von hinten anfangen
         for (long k = (in.length()-sepLaenge); k >= 0; k--)
         {
           in.seek(k);   //Cursor setzen
           in.read(b);   //Bytes von der Länge des Umbruchzeichnens lesen                
    
           //wenn gleich mit Umbruchszeichen, dann lies ab k bis zum Ende
           if ( (new String(b)).equals(sep) )
           {
             byte[] zeile = new byte[(int)(in.length() - k - sepLaenge)];
             in.read(zeile);
             letzteZeile = new String(zeile);
             break;
           }
         }
    
         System.out.println(letzteZeile);
    
         in.close();
    

    Ich hab's auf einem Windows-System mit zwei Dateien probiert und es ging. Natürlich ist Fehlerfreiheit nicht garantiert.



  • hm, sieht ziemlich krass aus 🙂 ich hab etwas rumgesucht und bin da auf folgendes gestoßen:

    import java.io.*;
    import java.text.*;
    import java.util.*;
    
    public class LesenSchreibenTextdatei_beta
    {
      public static void main( String[] args )
      {
    
        Vector vec = new Vector();
        String s;
    
        // Lies Textzeilen aus der Datei in einen Vector:
        try {
          BufferedReader in = new BufferedReader(
                              new InputStreamReader(
                              new FileInputStream( "Test.txt" ) ) );
          while( null != (s = in.readLine()) ) {
            vec.add( s );
          }
          in.close();
        } catch( FileNotFoundException ex ) {
        } catch( Exception ex ) {
          System.out.println( ex );
        }
    
        // Schreibe alle Elemente als Textzeilen in die Datei:
        try {
          BufferedWriter out = new BufferedWriter(
                               new OutputStreamWriter(
                               new FileOutputStream( "Display.txt" ) ) );
          for( int i=0; i<vec.size(); i++ ) {
            //if(i==vec.size()) {
            //i=i-1;
            s = vec.get( i ).toString();
            System.out.println( s );
            out.write( s, 0, s.length() );
            out.newLine();
            //}
          }
          out.close();
        } catch( IOException ex ) {
          System.out.println( ex );
        }
      }
    }
    

    das beispiel hab ich schon angepasst und soweit vereinfacht das es für meine zwecke reicht ...
    das tolle gegenüber dem anderen, die inhalte sind in einem vector gespeichert udn der ist dauerhaft außerdem läßt sich so auch verhältnismäßig einfach die speicherung vollziehen ...

    Jetzt hat ich gedacht, man könnte doch in diesem vector(arry) die position soweit verschieben, das man nur die letze zeile drin hat oder eben ausließt ... denn eine zeile in der Textdatei ist ja genau 1 lang. also dachte ich erst die schleife zum auslesen so zu gestallten, das der da zurückspring, bzw. nur das letzte ließt aber das ging so nicht...



  • die Klasse Vector besitzt die Methode lastElement.

    Könnte bei dir so aussehehn:

    //Schleife entfällt
            s = vec.lastElement().toString();
            System.out.println( s );
            out.write( s, 0, s.length() );
            out.newLine();
    


  • supi jetzt hat das tatsächlich geklappt die for-schleife hab ich dafür gelöscht sonst hab ich ja alles doppelt...



  • ich möchte den eingelesenen vector jetzt noch etwas nachbearbeiten für die ausgabe. nur irgendwie müßte man die inahlte auftrennen und wieder einfügen.

    die auszulesende datei hat folgendes zum inhalt:

    1
    2
    3
    4
    5 a b c
    

    Wenn das programm jetzt läuft passiert folgendes:

    5 a b c
    [1, 2, 3, 4, 5 a b c]
    5 a b c
    [1, 2, 3, 4, 5 a b c, 1, 2, 3, 4, 5 a b c]
    5 a b c
    [1, 2, 3, 4, 5 a b c, 1, 2, 3, 4, 5 a b c, 1, 2, 3, 4, 5 a b c]
    5 a b c
    [1, 2, 3, 4, 5 a b c, 1, 2, 3, 4, 5 a b c, 1, 2, 3, 4, 5 a b c, 1, 2, 3, 4, 5 a
    b c]
    5 a b c
    [1, 2, 3, 4, 5 a b c, 1, 2, 3, 4, 5 a b c, 1, 2, 3, 4, 5 a b c, 1, 2, 3, 4, 5 a
    b c, 1, 2, 3, 4, 5 a b c]
    

    Das letzendlich nur die letzte zeile in der Datei labdet ist zwar erreicht aber ich kann die letzte zeile nicht mehr manipulieren und so wies ausschaut bläht sich der vector auf bis der speicher kolabiert ...

    Eigentlich sollte zum schluß das ausgegeben werden " Text 5 Text2 a Text3 b Text4 c"

    hat da wer eine idee zu?


Anmelden zum Antworten