Brauch Hilfe um Textdatei auszulesen

Ich hab eine Textdatei wo informationen über Dateien drin stehen.
Diese Textdatei ist so aufgebaut.

Name|Pfad des Programms
Logdatei|C:\Logfiles\Inilog.conf
Edit3|C:\\Programme\Edit3\edit3.Ini
usw

Ich möchte diese Informationen auslesen und in ein Vector vom Typ IniFile speichern mit Namen und Pfad als Eigenschaften.Dazu hab ich eine Klasse IniFile angelegt wo ich mir ein Pfad und Name zurück geben lasse.

Als ergebnis wollte ich dann ein gefüllten Vector mit Inifiles haben die ein Namen und ein Pfad besitzen.

Meine load Methode sieht so aus:

public Vector<IniFile> loadIniFile()
{
Vector<IniFile> m_vIniFile = new Vector<IniFile>()
//Prüft ob meine Textdatei überhaupt da
if((m_propertyConfig != null) || (m_propertyConfig.length() != 0))
{
BufferedReader f;
String line ;
try
{
f = new BufferedReader(
new FileReader(m_propertyConfig));

while ((line = f.readLine()) != null)
{
StringTokenizer token = new StringTokenizer(line,"|");
if(token.hasMoreTokens())
{
IniFile file = new IniFile();
m_vIniFile.add(line);
hier weiß ich nicht wie ich das Programmieren soll damit ich
nur infiles in mein Vector hab aber mit 2 Eigenschaften,den pfad und den Namen /COLOR]
}
}
f.close();
}
catch (IOException e)
{
e.printStackTrace();;
System.out.println("Katalog konnte nicht geladen werden" + e);
}
}

Danke für eure Hilfe
 
Code:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;


public class TestClass{
	private final static String ENTRY_SEPARATOR = "|";
	
	
	public ArrayList<IniFile> loadIniFile(File m_propertyConfig){
		ArrayList<IniFile> iniFileList = null;

		if(m_propertyConfig == null) return null;
				
		//Prüft ob meine Textdatei überhaupt da
		if(m_propertyConfig.exists() && m_propertyConfig.length() > 0){
			BufferedReader f;
			String line ;
			try{
				f = new BufferedReader(new FileReader(m_propertyConfig));

				iniFileList = new ArrayList<IniFile>();
				while ((line = f.readLine()) != null){
					StringTokenizer token = new StringTokenizer(line, ENTRY_SEPARATOR);
					if(token.hasMoreTokens() && token.countTokens() == 2)
						iniFileList.add(new IniFile(token.nextToken(), token.nextToken()));

				}
				f.close();
				f = null;
			}catch(IOException e){
				e.printStackTrace();
				System.out.println("Katalog konnte nicht geladen werden" + e);
			}
		}

		return iniFileList;
	}


	private class IniFile{
		private String name;
		private String path;
		
		private IniFile(String n, String p){
			name = n;
			path = p;
		}
		
		
		public String getName(){
			return name;
		}


		public String getPath(){
			return path;
		}
	}
}

Oder habe ich was falsch verstanden? Ich verwende ArrayList anstatt Vector, da man Vector nur verwenden sollte wenn man mit mehreren Threads auf diese Liste zugreift. Denn Vector ist synchronized und ArrayList nicht...nur eine kleine Schönheitssache...

Viele Grüße
 
Zuletzt bearbeitet:
Ich hab noch ein problem...wie kann ich ein Element aus meine JList selektieren damit ich dieses auch löschen kann? bzw wie schaff ich es das ich wenn ich ein element lösche die Jlist sich gleich aktualisiert?
 
keine Ahnung was es mit dem Code zu tun hat, aber...

zur JList siehe:
JList


Mit der Funktion getModel das ListModel beschaffen. Da ich nicht weis welches ListModel du benutzt gehe ich mal davon aus das du das DefaultListModel benutzt.
siehe dazu:
DefaultListModel

Das DefaultListModel besitzt die Funktionen remove(index) und remove(object) welche davon du benutzt musst du entscheiden. Ich würde remove(index) bevorzugen. Ich vermute dass das Aktualisieren dann von alleine geschieht.

Zum Selektieren einfach die Funktion setSelectedIndex(index) der JList benutzen

Viele Grüße
 
Der Code hat mit mein Projekt zutun und darum hab ich gefragt.

private void jb_RemoveActionPerformed(java.awt.event.ActionEvent evt)
{
// TODO add your handling code here:
jList.getModel();
DefaultListModel listModel = new DefaultListModel();
int index = jList.getSelectedIndex();

if(index != -1)
{
IniConfigController.getInstance().deleteFile(index);
//da zeigt er mir ein Fehler
listModel.remove(index);

}
}

noch was anderes.....ich möchte ein ArrayList sortieren aber wie tausch ich die Elemente untereinander?

public ArrayList<IniFile> sortList()
{
//gibt mir eine ArrayList mit Inifiles
ArrayList<IniFile> iniFileList = loadIniFile();
ArrayList<IniFile> newFileList = new ArrayList<IniFile>();

if (iniFileList.size()==0)
{
return iniFileList;
}
else
{
int vergleich;

for (int i=0; i<iniFileList.size();i++)
{
for (int j=i+1;j<iniFileList.size();j++)
{
IniFile inifile = iniFileList.get(i);
String iniName = inifile.getFileName();
IniFile file = iniFileList.get(j);
String fileName = file.getFileName();

int zahl;
zahl = iniName.compareTo(fileName);


if(zahl == 0)
{
continue;// v - nächste Spalte untersuchen
}

if(zahl < 0)
{
//soll getauscht werden

}
else if(zahl > 0)
{

}
}
}
}
return newFileList;
}
 
keine Ahnung was es mit dem Code zu tun hat, aber...

zur JList siehe:
JList


Mit der Funktion getModel das ListModel beschaffen. Da ich nicht weis welches ListModel du benutzt gehe ich mal davon aus das du das DefaultListModel benutzt.
siehe dazu:
DefaultListModel

Das DefaultListModel besitzt die Funktionen remove(index) und remove(object) welche davon du benutzt musst du entscheiden. Ich würde remove(index) bevorzugen. Ich vermute dass das Aktualisieren dann von alleine geschieht.

Zum Selektieren einfach die Funktion setSelectedIndex(index) der JList benutzen

Viele Grüße

Danke für die Antwort aber ich mach trotzdem irgend was flasch denn ich bekomm ein ArrayIndexOutOfBoundsException ich find aber den Fehler nicht.


private void jb_RemoveActionPerformed(java.awt.event.ActionEvent evt)
{
// TODO add your handling code here:
int index = jList.getSelectedIndex();
DefaultListModel listModel = new DefaultListModel();

jList.setModel(listModel);

if(index != -1)
{
IniConfigController.getInstance().deleteFile(index);
listModel.remove(index);
IniConfigController.getInstance().deleteFile(index);
listModel.remove(index);
Object ini = listModel.getElementAt(index);
listModel.removeElement(ini);

}
}
ich hab jetzt schon beide Varianten versucht,ich schaff es einfach nicht ein einzelnes Element zu löschen.
Danke für eure Hilfe
 
Ist doch klar,

du solltest

Code:
private void jb_RemoveActionPerformed(java.awt.event.ActionEven t evt)
{
// TODO add your handling code here:
jList.getModel();
DefaultListModel listModel = new DefaultListModel();
int index = jList.getSelectedIndex();

if(index != -1)
{
IniConfigController.getInstance().deleteFile(index );
//da zeigt er mir ein Fehler
listModel.remove(index);

}
}

abändern in:
Code:
private void jb_RemoveActionPerformed(java.awt.event.ActionEven t evt)
{
// TODO add your handling code here:
DefaultListModel listModel = jList.getModel();
int index = jList.getSelectedIndex();

if(index != -1)
{
IniConfigController.getInstance().deleteFile(index );
//da zeigt er mir ein Fehler
listModel.remove(index);

}
}

also war eigentlich nur das new DefaultListModel falsch, da du ja kein neues Model anlegen willst sondern das bereits Vorhandene nutzen möchtest.

Viele Grüße
 
...
noch was anderes.....ich möchte ein ArrayList sortieren aber wie tausch ich die Elemente untereinander?

public ArrayList<IniFile> sortList()
{
//gibt mir eine ArrayList mit Inifiles
ArrayList<IniFile> iniFileList = loadIniFile();
ArrayList<IniFile> newFileList = new ArrayList<IniFile>();

if (iniFileList.size()==0)
{
return iniFileList;
}
else
{
int vergleich;

for (int i=0; i<iniFileList.size();i++)
{
for (int j=i+1;j<iniFileList.size();j++)
{
IniFile inifile = iniFileList.get(i);
String iniName = inifile.getFileName();
IniFile file = iniFileList.get(j);
String fileName = file.getFileName();

int zahl;
zahl = iniName.compareTo(fileName);


if(zahl == 0)
{
continue;// v - nächste Spalte untersuchen
}

if(zahl < 0)
{
//soll getauscht werden

}
else if(zahl > 0)
{

}
}
}
}
return newFileList;
}

Bist du sicher, dass du die Liste per Hand sortieren willst? Ich meine dazu gibt es extra Methoden im jdk (musst dir halt gegebenenfalls noch einen eigenen Comparator schreiben, IniFile Comparable nicht implementiert)

Collections.sort(List)
Collections.sort(List,Comparator)

bye
 
Ist doch klar,

du solltest

Code:
private void jb_RemoveActionPerformed(java.awt.event.ActionEven t evt)
{
// TODO add your handling code here:
jList.getModel();
DefaultListModel listModel = new DefaultListModel();
int index = jList.getSelectedIndex();

if(index != -1)
{
IniConfigController.getInstance().deleteFile(index );
//da zeigt er mir ein Fehler
listModel.remove(index);

}
}

abändern in:
Code:
private void jb_RemoveActionPerformed(java.awt.event.ActionEven t evt)
{
// TODO add your handling code here:
DefaultListModel listModel = jList.getModel();
int index = jList.getSelectedIndex();

if(index != -1)
{
IniConfigController.getInstance().deleteFile(index );
//da zeigt er mir ein Fehler
listModel.remove(index);

}
}

also war eigentlich nur das new DefaultListModel falsch, da du ja kein neues Model anlegen willst sondern das bereits Vorhandene nutzen möchtest.

Viele Grüße


Na sowas hab ich auch schon versucht aber er zeigt mir an das meine Typen nicht stimmt obwohl ich ihn in einer Methode ein zuweise.

DefaultListModel m_listModel = new DefaultListModel();
jList.setModel(m_listModel);


DefaultListModel listModel = jList.getModel();

found ListModel
required DefaultListModel
Was kann ich denn noch machen damit ich endlich mein selektiertes Element bekomme?

hab es jetzt so geändert das ich ein DefaultListModel bei meiner add Methode zurück gebe aber trotzdem ist mein Index immer -1.


DefaultListModel listModel = addListFileName();
int index = jList.getSelectedIndex();

if(index != -1)
{
IniConfigController.getInstance().deleteFile(index );
listModel.remove(index);

}
 
Zuletzt bearbeitet:
Na sowas hab ich auch schon versucht aber er zeigt mir an das meine Typen nicht stimmt obwohl ich ihn in einer Methode ein zuweise.

DefaultListModel listModel = jList.getModel();

found ListModel
required DefaultListModel
Was kann ich denn noch machen damit ich endlich mein selektiertes Element bekomme?
Die Fehlermeldung ist schon richtig, denn getModel gibt natürlich ein ListModel zurück also die abstrakte Oberklasse von DefaultListModel. Da die JList an dieser Stelle geschickter Weise gebrauch von dem Polymorphismus macht musst du natürlich das zurückgegebene ListModel auf DefaultListModel casten. also:
Code:
DefaultListModel listModel = (DefaultListModel)jList.getModel();

Und sofern du nicht etwas anderes als einfache Strings in deiner JList darstellen möchtest ist das bereits vorhandene DefaultListModel vollkommen ausreichend.

hab es jetzt so geändert das ich ein DefaultListModel bei meiner add Methode zurück gebe aber trotzdem ist mein Index immer -1.


DefaultListModel listModel = addListFileName();
int index = jList.getSelectedIndex();

if(index != -1)
{
IniConfigController.getInstance().deleteFile(index );
listModel.remove(index);
}

Das zurückgeben eines ListModels solltest du aus deinem Code entfernen da eine List auch immer nur ein zugehöriges ListModel besitzen kann und dieses eine ListModel erhältst du über getModel(). Das entspricht der Model/View-Trennung der MVC-Architektur.

Viele Grüße
 
Danke sowas hab ich mir schon gedacht.
Hab mien Fehler erkannt und beseitigt.

So jetzt komm ich zu den schwersten Teil.Das Einlesen der Inidateien klappt und nun möchte ich den Inhalt darstellen.
Jede Information in ein Panel mit ein Label und ein TextFeld.
Wäre es schlau eine Klasse in JPanel Form anzulegen?
schließlich brauch ich ja immer die gleiche Form für jede Information um diese dann darzustellen?
Gibt es da Sachen die mir das erleichtern?
Danke
 
Zuletzt bearbeitet:
So wie ich dich verstehe willst du nur die Informationen über die ini-Dateien von oben einzeln darstellen, oder? Also ich würde, wie du schon vorschlägst, eine eigene JPanel-Klasse von JPanel ableiten und in dieser dann jeweils ein Label und ein Textfeld für "name" und "path" anlegen. Dann gibst du dem Panel noch funktionen wie public void setName(String) und public void setPath(String) mit denen du dann die Textfelder befüllst. Vermutlich soll das Ganze geschehen sobald sich die Auswahl der JList ändert, oder? Dafür wirst du dir die Funktion addListSelectionListener der JList und das Interface ListSelectionListener anschauen müssen falls du es noch nicht getan hast. ;)

Viel Erfolg
 
Das war fast richtig,nur will ich nicht informationen der Inifiles darstellen sondern den Inhalt der einzelnen IniFiles.
Ich möchte von jeden Block die Informationen die in den Inifile drin stehen in ein Label und den dazugehörigen Wert in ein textfeld tun,natürlich muß ich den wert auch verändern können.
Jedenfalls will ich ein Panel mit ein Label und ein textfeld schaffen und das soll sich je nach dem wieviel informationen und blöcke vorhanden sind selbst verdoppeln und die Informationen darstellen. Der name und path der Inidatei brauch ich nur um das Inifile aus meiner JList auch öffnen zu können und zu speichern.
Am ende soll eine Oberfläche herauskommen die Inidateien verwalten kann und auch configurieren kann.
 
Dann ist es wohl doch nicht ganz so einfach. Da du eine variable Anzahl von Blöcken hast und in diesen Blöcken eine variable Anzahl von Key/Value-Paaren würde ich an deiner Stelle für die Key/Value-Paare eine JTable mit 2 Spalten verwenden. Auch hier musst du wieder die Model/View-Trennung beachten --> DefaultTableModel.
Für die Darstellung der Blöcke würde ich dann eine JList oder vielleicht (optisch) besser einen JTree verwenden. Bei der JTree-Variante wäre es dann so ähnlich wie bei dem Windows-Registry-Editor. Also müsstest du es so programmieren das wenn etwas in der JList oder JTree ausgewählt wird die Werte des ausgewählten Blocks in der 2-spaltigen JTable dargestellt werden.

Ich hoffe ich habe diesmal verstanden was du meinst. ;)

Viel Erfolg!

[EDIT]
Wenn du es dir ganz einfach machen willst dann nimmst du nur einen JTree in welchem du dann unter den Block-Nodes die einzelnen Key-Nodes des Blocks hängst. Und wenn dann auf einen Key geklickt wird zeigst du den Wert des Keys in einem JTextField an....
[/EDIT]
 
Zuletzt bearbeitet:
Ich weiß nicht ob ich dich jetzt vesrtanden hab.
Ich hab eine JList wo meine Inidatien mit namen drinn stehen. Dort les ich aber nicht die dateien ein. Es soll nur zur reinen auswahl gedacht sein.Wenn ich dann eine IniDatei auswähle soll per config Button eine selbständige Oberfläche generiert werden.
Die Inidateien in meiner JList speichere ich in eine Property Datei wo der Name und der Pfad drinn steht. Den Pfad übergeb ich dann bei auswahl Buttan an mein IniReader und der gebt mir die Infos und erstellt mein Config oberflcähe bzw verdoppelt mein Panel bis alle infos dargestellt sind.Dann kann man die Infos bearbeiten und abspeichern direkt wieder in ie Inidatei. Es soll keine datebank von Inidateien sein wo ich alles infos der dateien speichere.Möchte da den einfachen weg gehen wo ich es wieder direkt in die Datei speichere.

Meine JList hat also nur Inifiles mit 2 Eigenschaften Name und Pfad die ich in eine Probertydatei speichere.

Es soll ein Panel : sein mit 1 Label für Key und ein Textfeld für den value geben
Dieses Panel soll sich so oft generieren wie informationen Vorhanden sind.
Blöcke stell ich nur mit ein label als überschrift dar.


So in der Art dacht ich mir das. Das Model-View-Controller Prinziep wende ich schon an und auch alles schön getrennt:D

Vllt gibt es aber noch ein einfacheren Weg oder klassen die schon fertig sind und die mir helfen.

Ich muß mich jetzt echt beeilen sonst schaff ich das nicht mit der zeit.
 
Den Pfad übergeb ich dann bei auswahl Buttan an mein IniReader und der gebt mir die Infos und erstellt mein Config oberflcähe bzw verdoppelt mein Panel bis alle infos dargestellt sind.
Ist das denn schon fertig? Wenn es so funktioniert wie du dir das vorstellst dann ist doch alles okay, oder nicht? Ich hätte blos die JTree oder JTable-Variante gewählt da du ja scheinbar sehr oft Daten anzeigen möchtest deren Aufbau identisch ist. Zudem wäre es wohl noch etwas platzsparender gewesen. Eine JScrollPane brauchst du wahrscheinlich sowieso.

Vllt gibt es aber noch ein einfacheren Weg oder klassen die schon fertig sind und die mir helfen.
Wie gesagt fallen mir da spontan JTree, JTable und JScrollpane ein. Aber ich hab keine Ahnung welchen Weg du jetzt gewählt hast und was jetzt schon bei dir fertig ist und was nicht.

Viele Grüße
 
Das oben war nur meine Idee wie ich es mir vorgestellt hab.ich muß das mehrmals im kopf durch gehen damit ich nix vergess und ich bin ja erst Änfänger und hab noch nicht gleich alle ablaufe im Kopf die ich brauch.

Fertig ist bis jetzt die Oberfläche, das einfügen und entfernen der Inidateien in die Liste.
Model-View-Prinzip hab ich auch verwendet

Hab jetzt noch 2 Wochen Gesamtzeit die mir zur verfügung steht.
Die Woche versuche ich meine JP-Panel Klasse zu programmieren mit JScrollpane usw. und dann später den IniReader der mir die Informationen gibt.
Als letztes muß ich das irgend wie verknüpfen.
Also das schwerste liegt erst noch vor mir.

Ich hab noch mal ne Frage zum Sórtieren meiner ArrayList.

ich hab in der Klasse IniFile eine Methode Programmiert die mir die Namen der Inifiles vergleicht.

public int compare(IniFile o1, IniFile o2)
{
String name1 = o1.getFileName();
String name2 = o2.getFileName();
return name2.compareTo(name1);
}

dazu implementiere ich Comparable<IniFile>

Nun zeigt es mir den fehler das die klasse nicht abstract ist.

Wie kann ich nun aus einer anderen Klasse wo ich meine Arraylist fülle auf die compare Methode zugreifen?

ich dachte an sowas aber das fiúnktieniert nicht.

Comparator<IniFile> comparator = new IniFile(String pfad, String name);
java.util.Collections.sort( IniFile, comparator );

wenn ich das
 
Zuletzt bearbeitet:
nicht übel nehmen, aber - ich finde das hier ganz schön OT bzgl. BSD
Java lernen ist mit Unterstützung anderer Foren wahrscheinlich effektiver.
:huth:

@newangel85
Ansonsten lasse mir Doch einfach Deine Anforderungen zukommen,
ich schicke Dir dann ein entspr. Angebot für die Umsetzung in Java.
 
ich hab in der Klasse IniFile eine Methode Programmiert die mir die Namen der Inifiles vergleicht.

public int compare(IniFile o1, IniFile o2)
{
String name1 = o1.getFileName();
String name2 = o2.getFileName();
return name2.compareTo(name1);
}

dazu implementiere ich Comparable<IniFile>

Nun zeigt es mir den fehler das die klasse nicht abstract ist.

Die Fehlermeldung bedeutet nicht dass die Klasse nicht abstrakt ist sondern dass die Klasse nun abstrakt ist, da du das Interface Comparable in der implements-Klausel aufgeführt hast aber nicht die Methode "compareTo", welche das Interface vorschreibt, implementiert hast.

Wie kann ich nun aus einer anderen Klasse wo ich meine Arraylist fülle auf die compare Methode zugreifen?

ich dachte an sowas aber das fiúnktieniert nicht.

Comparator<IniFile> comparator = new IniFile(String pfad, String name);
java.util.Collections.sort( IniFile, comparator );

Ich glaube dein Denkansatz war da etwas verkehrt. Der Comparator ist ein Interface welches du separat in einer neuen Klasse implementieren solltest. Er hilft dabei die Sortierung genauer festzulegen(z.B. aufsteigend, absteigend, ...). Die Methode sort der Klasse Collections ist dazu da um Listen zu sortieren. Du hast jedoch sort nur ein einzelnes Objekt und einen Comparator gegeben...Was würdest du machen wenn man dir eine einzige Zahl gibt und dann sagt "sortier mal aufsteigend!"?

so ungefähr müsste es wohl aussehen:
Code:
public class IniFile implements Comparable<IniFile>{
	private String name;
	private String fileName;

	public IniFile(String n, String p){
		name = n;
		fileName = p;
	}


	public String getName(){
		return name;
	}


	public String getFileName(){
		return fileName;
	}


	public int compareTo(IniFile file){
		return file.getFileName().compareTo(getFileName());
	}
}


public class IniFileComparator implements Comparator<IniFile>{
	public int compare(IniFile aIniFile, IniFile bIniFile){
		return 0;
	}


	public boolean compare(IniFile bIniFile){
		return false;
	}
}
Die compare-Methoden des Comparators müsstest du dann noch genauer implementieren. Wenn du jedoch mit der Default-Sortierreihenfolge zufrieden bist brauchst du auch den Comparator nicht.

Aufruf wäre dann wie folgt:
Code:
ArrayList<IniFile> iniFileList2 = new ArrayList<IniFile>(); //leere Liste
IniFileComparator comparator = new IniFileComparator();
java.util.Collections.sort(iniFileList2, comparator); // mit Comparator
java.util.Collections.sort(iniFileList2); // ohne Comparator

Viele Grüße
 
Zurück
Oben