Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
also mit der ReadFile Methode kann man ja Files einlesen und der inhalt wird dann auf der Konsole ausgegeben...aber wie kann ich diese Werte verwenden?
also nehmen wir mal an in der .txt steht:
Wert 15
Wert 17
Wert 45
Wie kann ich jetzt einen Kreis zeichen der die Zahlen benutzt z.B. "17" als größe?
also mit der ReadFile Methode kann man ja Files einlesen und der inhalt wird dann auf der Konsole ausgegeben...aber wie kann ich diese Werte verwenden?
also nehmen wir mal an in der .txt steht:
Wert 15
Wert 17
Wert 45
Wie kann ich jetzt einen Kreis zeichen der die Zahlen benutzt z.B. "17" als größe?
Angenommen, Du liest das txt-File Zeile für Zeile. Sobald die Zeile mit dem Radius gelesen worden ist, kannst Du den Wert einer Variablen zuweisen und diese Variable beim Zeichnen des Kreises verwenden.
Am besten du beachtest beim Erstellen der Textdatei gleich darauf, damit man es gut laden kann.
Beispielsweise willst du die Daten von drei Kreisen speichern. Dann lässt du einfach sowas in der Art in die Datei schreiben.
Nehmen wir an du hast 3 Kreise mit drei unterschiedlichen Radien. Dann schreibst du die am Besten so in die Datei:
12|13|14
Erklärung: 12 Ist der Radius des ersten Kreises, 13 der Radius des Zweiten... Der | ist einfach eine Trennung der einzelnen Radien und erleichtert das Laden ungemein.
Ich lese die Datei dann immer mit der folgender Methode aus:
Java:
public String Laden(String Dateiname) // .txt nicht vergessen
{
try{
FileReader preisleser = new FileReader(Dateiname);
StringBuilder text = new StringBuilder(10);
int gelesen;
boolean ende = false;
while(!ende)
{
gelesen = preisleser.read();
if(gelesen == -1)
{
ende = true;
}
else
{
text.append( (char) gelesen);
}
}
return text.toString();
}
catch(Exception e)
{
return "Felher!!!";
}
}
Die Methode gibt den Inhalt der Textdatei als einen einzigen String zurück, also "12|13|14"
Des aufdröseln eines solchen Strings geht am Besten mit der Klasse StringTokenizer:
Java:
String alleRadien = Landen(Radien.txt); //Schreibt den gesammten Dateiinhalt in diesen String
StringTokenizer r = new StringTokenizer(alleRadien, "|"); //Erzeugt einen neuen StringTokenizer(DenStringDenDuTeilenWillst , Kriterium nach dem geteilt wird)
Jetzt musst du nur noch die Radien eintragen. Dabei muss der String Wert (bsp. "12") in die Integer Zahl 12 konvertiert werden.
Java:
int radius1 = Integer.valueOf(r.nextToken());
int radius2 = Integer.valueOf(r.nextToken());
int radius3 = Integer.valueOf(r.nextToken());
Integer.valueOf konvertiert den String (bsp. "12") in den Integer Wert 12, sodass er in die Integer Variable geschrieben werden kann.
nextToken() ist eine Methode des StringTokenizers. Sie schaut nach, wo in den String, der anfangs übergeben wurde, das Suchkriterium beinhaltet und liefert den String von allem aus, was davor kommt.
In unserem Fall liefert der erste Aufruf von nextToken() "12" , der zweite "13" und der dritte "14", da beim erneuten Aufruf immer zum nächsten Schlüsselkriterium gesprungen wird.
So ich hoffe du hast alles verstanden und kannst es anwenden. Wenn es noch Unklarheiten gibt, meld dich einfach
ok das hat alles soweit gefunzt... also bei mir kann man halt noch die gewünschte Datei in einem Fenster auswählen aber sonst is es das gleiche.
mit sout werden auch die 3 Werte getrennt ausgegeben. (Datei Inhalt= 12|13|15 )
aber irgendwie hat er trotzdem ein Problem welches ich nicht ganz verstehe.
der code:
Java:
package readfiles;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author tom
*/
public class ReadFiles {
public ReadFiles() {
readFile();
}
public void readFile() {
JFileChooser chooser = new JFileChooser();
int r = chooser.showOpenDialog(new JFrame());
if (r == JFileChooser.APPROVE_OPTION) {
String path = chooser.getSelectedFile().getPath();
BufferedReader inputStream = null;
try {
inputStream = new BufferedReader(new FileReader(path));
String l;
while ((l = inputStream.readLine()) != null) {
String alleRadien =(l);
StringTokenizer werte = new StringTokenizer(alleRadien, "|");
int radius1 = Integer.valueOf(werte.nextToken());
int radius2 = Integer.valueOf(werte.nextToken());
int radius3 = Integer.valueOf(werte.nextToken());
System.out.println(radius1);
System.out.println(radius2);
System.out.println(radius3);
}
} catch (IOException ex) {
System.out.println("ERROR: File not found or access not possible: " + path);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException ex) {
System.out.println("ERROR: File close failed for: " + path);
}
}
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
ReadFiles rf = new ReadFiles();
rf.readFile();
}
});
}
}
Der Fehler (Konsole):
Java:
run:
12
13
15
Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:332)
at readfiles.ReadFiles.readFile(ReadFiles.java:41)
at readfiles.ReadFiles.<init>(ReadFiles.java:22)
at readfiles.ReadFiles$1.run(ReadFiles.java:71)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Steht doch da: NoSuchElementException, ergo gibt es kein nächstes Element für den Tokenizer. Lass dir doch mal die Zeile ausgeben bevor du diese verarbeitest.
Grund ist sicherlich, dass in der Datei ne Leerzeile ist, bzw. ein Zeilenumbruch nach der letzten Zeile.
gib doch jeweils vor dem StringTokenizer die Zeile l bzw. alleRadien aus, vielleicht hat eine Zeile nicht das erwartete Format,
wenn man am Ende einer Datei Enter drückt, schleicht sich gerne eine Leerzeile "" ein
verdammt es lag echt an einer Leerzeile vielen Dank!
ok dann hab ich noch eine Frage:
wie benutze ich Klassenübergreifende Variabeln?
also ich habe eine extra Klasse die nur die Kreise Zeichnen soll mit den radius1, radius2 und radius 3 Werten aber in meiner Zeichen Klasse kennt der die nicht...da die da ja nicht initialisiert sind.
ist das irgendwie machbar?