Java kann nicht aus .txt-Datei lesen?

2 Antworten

Zuerst einmal: Die Fehlermeldungen kommen nicht direkt von der Methode "getIndex". Vielleicht höchstens indirekt, weil getIndex halt einen falschen Wert zurückgibt.

Dann ganz wichtig: Wenn du prüfen willst, ob der Scanner als nächstes einen int-Wert lesen kann, benutze bitte sc1.hasNextInt(). Sonst kann es sein, dass du mit hasNext() zwar gemeldet kriegst, dass etwas in der Datei steht, aber kriegst danach eine InputMismatchException, weil der Scanner das nächste Token nicht in ein int umwandeln kann. Ich würde dir zum debuggen auch empfehlen, ein sysout in den if-Block reinzumachen, damit du siehst, ob er überhaupt ausgeführt wird.

Was mir noch aufgefallen ist: Die Variable index wird nicht in der Methode deklariert. Das heißt, du greifst auf eine Klassenvariable zu. Ich weiß nicht, ob das beabsichtigt ist. Könnte aber später ein Stolperstein beim debuggen werden. Ich gehe immer automatisch davon aus, dass alles, was returnt wird auch nur lokal in der Methode existiert.

Zur Methode nextInt musst du auch wissen, dass der Scanner standardmäßig Whitespace (Leerzeichen, Zeilenumbrüche, Tabs etc.) als Trennzeichen sieht. Wenn in der Datei also z.B. 10.03.2022 steht, wird das nicht als drei Zahlen eingelesen, sondern der Scanner sagt nur, dass er den Wert nicht zu einem int umwandeln kann.

Evtl. ist auch wirklich die Codierung falsch. Ich hab die Option, dass man die Codepage angeben kann, bisher noch nie gebraucht, weil der Scanner alleine das Richtige genommen hat. Wenn die Daten in der Tabelle jetzt aber z.B. utf-16 sind und der Scanner versucht, sie mit cp1252 einzulesen, erkennt er die Zahlen nicht richtig.

DZNRandom 
Fragesteller
 10.03.2022, 17:51

Er geht leider nicht in die if rein. Habe diese mal weg gemacht und direkt index=sc1.nextInt(); gemacht, da sowieso immer nur eine Zahl in zukunft in der .txt stehen wird. Nun kommen folgende Fehler:

Exception in thread "main" java.util.NoSuchElementException

at java.base/java.util.Scanner.throwFor(Scanner.java:937)

at java.base/java.util.Scanner.next(Scanner.java:1594)

at java.base/java.util.Scanner.nextInt(Scanner.java:2258)

at java.base/java.util.Scanner.nextInt(Scanner.java:2212)

at de.flg.spektrometerinterface.variables.Database.getIndex(Database.java:80)

at de.flg.spektrometerinterface.serververbindung.Main.main(Main.java:27)

0
daCypher  11.03.2022, 07:56
@DZNRandom

Das ist wirklich merkwürdig. Und du bist sicher, dass in der Variable "path" der richtige Pfad übergeben wird (vielleicht ein relativer Pfad, an dem eine Datei mit dem gleichen Namen liegt) und dass in der Datei auch wirklich was drinsteht (nicht irgendwo vergessen, auf "speichern" zu klicken?)

Ich hatte es bisher noch nie, dass der Scanner nichts gelesen hat.

0
DZNRandom 
Fragesteller
 14.03.2022, 09:10
@daCypher

Ja, der Pfad ist einfach der name der Datei Store.txt

Da bin ich mir sicher, dass es klappt, da meine Properties File genau auf dem gleichen liegt. So wirds Aufgerufen: System.out.println(DB.getMeasurement(DB.getIndex("Store.txt")).getCharge());

Habs mal mit einem BufferedReader versucht. Der Code:

public int getIndex(String path) throws IOException {

InputStream file = new FileInputStream(path);

BufferedReader reader = new BufferedReader(new InputStreamReader(file));

index = Integer.parseInt(reader.readLine());

System.out.println(index);

return index;

}

Der error:

Exception in thread "main" java.lang.NumberFormatException: null

at java.base/java.lang.Integer.parseInt(Integer.java:622)

at java.base/java.lang.Integer.parseInt(Integer.java:778)

LG

0
daCypher  14.03.2022, 09:55
@DZNRandom

Ich würde trotzdem mal probieren, ob es besser klappt, wenn du einen absoluten Pfad angibst (also sowas, wie DB.getIndex("C:\\test\\Store.txt")). Es kann auch sein, dass die Properties Datei einfach eine Kopie von einer anderen Datei ist und es deshalb klappt.

0
DZNRandom 
Fragesteller
 14.03.2022, 10:09
@daCypher

Es klappt - traurig dass ich da so lang dran saß.. danke!!

0
daCypher  14.03.2022, 10:14
@DZNRandom

Bitteschön 👍

PS: Du kannst mal schauen, welche Datei geöffnet wird, wenn du nur "Store.txt" als Dateinamen übergibst:

System.out.println(Paths.get("Store.txt").toAbsolutePath());

Da wird warscheinlich sowas in der Art "C:\Users\Ich\eclipse-workspace\Project\Store.txt" rauskommen.

0

Probiers mal mit

BufferedReader reader = new BufferedReader(new FileReader(file));
String firstLine = reader.readLine();
int i = Integer.parseInt(firstLine);

Kann ja nicht sein, dass er den Inhalt einfach nicht findet. Vielleicht ist das Encoding falsch?

DZNRandom 
Fragesteller
 14.03.2022, 09:11

 Habs mal mit einem BufferedReader versucht. Geht leider dennoch nicht :( Der Code:

public int getIndex(String path) throws IOException {

InputStream file = new FileInputStream(path);

BufferedReader reader = new BufferedReader(new InputStreamReader(file));

index = Integer.parseInt(reader.readLine());

System.out.println(index);

return index;

}

Der error:

Exception in thread "main" java.lang.NumberFormatException: null

at java.base/java.lang.Integer.parseInt(Integer.java:622)

at java.base/java.lang.Integer.parseInt(Integer.java:778)

LG

0
verreisterNutzer  14.03.2022, 10:58
@DZNRandom

ja die Datei kann entweder nicht gefunden werden oder es ist nichts in der Datei drin bzw keine richtige nummer

0