Java In-/-output

blablaxyz

Grünschnabel
Zuerst einmal. Ich kenne mich mit Java nicht besonders gut aus und mit anderen Programmiersprachen auch nicht.

Folgendes:

Wie lese ich am einfachsten eine Text-Datei in eine Javaklasse ein?
Die Textdatei soll dabei folgendermaßen aufgebaut sein:
Name, Typ, Wert
Name, Typ, Wert
...

Also zum Beispiel:

blabla, String, Hallo
blubb, int, 7
gaga, char, c
...

Als Typen sind nur die einfachen Javatypen zugelassen. Die Namen sind eindeutig, also es kann zum Beispiel kein weiteres Daten-Triple blabla, int, 15 in meinem Beispiel vorkommen, weil Name schon vergeben.

Die Daten sollen folgendermaßen manipulierbar sein:
Ändern eines Wertes, also z. B. den Wert von blubb auf 9 setzen
löschen eines Datensatzes, also löschen einer Zeile
hinzufügen eines Datensatzes, hinzufügen einer Zeile

Wie lade ich jetzt eine solche Datei in meine Klasse? Welche interne Datenstruktur dieser Textdatei ist vorteilhaft um die Manipulationen gut ausführen zu können? Vector? Liste? und wie kriege ich die Daten aus der Textdatei in eine solche Datenstruktur?
Ja und wie speichere ich die geänderten Werte wieder in diese Datei.

Das ganze soll letzlich eine Bean werden, das ist aber erstmal nebensächlich
 
Servus!

Code:
/*
 * TestFile.java
 *
 * Created on 3. November 2003, 20:56
 */

import java.util.*;
import java.io.*;

/**
 *
 * @author  Administrator
 */
public class TestFile {
    
    private ArrayList al = null;
    private BufferedReader br = null;
    private BufferedWriter bw = null;
    
    /** Creates a new instance of TestFile */
    public TestFile() {
    }
    
    private void init(String file){
        al = new ArrayList();
        try{
            br = new BufferedReader(new FileReader(file));
        }catch(IOException ioe){
            ioe.printStackTrace();
        }
    }
    
    public void doIt(String file){
        init(file);
        if (br == null)
            return;
        else readIn();
        doAction();
        try{
            bw = new BufferedWriter(new FileWriter(file));
            int cnt = al.size();
            for(int i =0; i < cnt; i++){
                bw.write((String)al.get(i)+"\r\n");
            }
        }catch(IOException ioe){
            ioe.printStackTrace();
        }finally{
            if (bw != null){
                try{
                    bw.flush();
                    bw.close();
                    bw = null;
                }catch(IOException ioe){
                    ioe.printStackTrace();
                }
            }
        }
        
    }
    
    private void doAction(){
        changeVal("blabla","Tach");
        removeRow("gaga");
        addRow("test","long","10000l");
    }
    
    private void addRow(String name, String type, String value){
        al.add(new String(name + ", " + type +", " + value));
    }
    
    private void readIn(){
        if (br == null)
            return;
        else {
            String line = "";
            try{
                while( (line = br.readLine()) != null){
                    al.add(line);
                    System.out.println(line);
                }
                br.close();
                br = null;
            }catch(IOException ioe){
                ioe.printStackTrace();
            }
        }
    }
    
    private void removeRow(String name){
        int cnt = al.size();
        for (int i = 0; i < cnt; i++){
            String tmp = (String)al.get(i);
            if(tmp.substring(0,tmp.indexOf(',')).equals(name)){
                al.remove(i);
                cnt--;
            }
        }
    }
    
    private void changeVal(String val, String newValue){
        int cnt = al.size();
        for(int i = 0; i < cnt;i++){
            String tmp = (String)al.get(i);
            String name = null;
            int idx = 0;
            int idx2 = -1;
            name = tmp.substring(0,idx = tmp.indexOf(','));
            if (name.equals(val)){
                StringBuffer sb = new StringBuffer(tmp.length());
                idx2 = tmp.indexOf(',',idx+1)+1;
                sb.append(tmp.substring(0,idx2)).append(" "+newValue);
                al.set(i, sb.toString());
            }
        }
    }
    
    
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new TestFile().doIt("e://TestFile.txt");
    }
    
}

Vielleicht hilfts dir ja ...

Gruß Tom
 
Die Textdatei würde ich mit einem BufferedReader zeilenweise einlesen und die Strings mit einem StringTokenizer zerlegen. Die Werte einer Zeile würde ich in ein Hilfsobjekt stecken (mit set und get-Methoden um die Werte zu setzen und zu holen). Die Hilfsobjekte würde ich in einen Vector werfen.
 
weitere Frage:

wenn ich jetzt eine Zeile aus meiner Textdatei Löschen will

Also Datei hat folgenden Aufbau:

blabla, String, Hallo
blubb, int, 7
doof, char, a

und ich will jetzt die mittle Zeile löschen damit die Textdatei hinterher so aussieht:
blabla, String, Hallo
doof, char, a

und wie ändere ich am einfachsten einen Wert? Also aus blabla, String, Hallo soll z.B.:
blabla, String, Wald werden

Hat sich erledigt, funktioniert jetzt.
 
Zuletzt bearbeitet:
Servus!

Hmmm... dachte das käme alles aus meinem Beispiel hieraus ...
ich Verwende eine ArrayList statt eines Vectors um die eingelsenen Zeilen zu bearbeiten ...
mit removeRow(String name) löscht die Zeile mit dem Namen name ...
changeVal(String val, String newValue) ändert den Wert mit dem Namen val in den Wert newValue ...

Gruß Tom
 
ich nochmal

Hmmm... dachte das käme alles aus meinem Beispiel hieraus ...

hatte da bei mir nur nen dämlichen Fehler eingebaut.

Mal ne andere Frage:
Wenn ich jetzt einige Strings habe wie z.B.

Sring a = "7";
String b = "Wald";
String c = "9.5"

Kann ich da jetzt überprüfen welcher "eigentliche typ" sich hinter dem String verbirgt

Also ich will das Einträge wie addRow("Bla", "int", "Hallo") ungültig sind, da Hallo nicht vom Typ int ist.
 
Servus!

Diese Typüberprüfung musst du eben durch eine
Fallunterscheidung erledigen ... in der Datei stehen ja nur Textdaten ...
D.h. eine Zahl(int) wie 123 wierd nicht als Bitfolge 1111011 sondern als Zeichenfolge (Ascii/Unicode) 49 50 51 ... gespeichert

Wenn du eine Datentypenspezifische Speicherung haben möchtest, dann musst du dir für alle möglichen Datentypen eine eigene Ausgabemethode bzw. eine Ausgabemethode schrieben, die auf alle unterschiedlichen Typen reagieren kann...

Gruß Tom
 
und wie mach ich solche Fallunterscheidungen?

Wenn ich jetzt eine Methode testType habe

public boolean testType(String typ, String wert) {
//und da jetzt ein paar if-abfragen reinsetze wie

if(typ.equals("int") && isInt(wert))
return true;

if(typ.equals("float") && isFloat(wert))
return true;
...



Wie müssten den jetzt die Methoden isInt oder isFloat aussehen. Gibt es da nicht was für?
 
Zurück