Einlesen einer txt von BufferedReader klappt nicht wie gewünscht

Kiesen

Mitglied
Hallo!

Ich habe folgendes Problem: Ich möchte mit Hilfe des BufferedReader eine txt mit Binärzahlen, Zeile für Zeile, einlesen und dann jede Zeile in eine Dezimalzahl umwandeln. Meine Methode, welche die Binärzahl in eine Dezimalzahl umwandelt funktioniert, wenn ich manuell einen String definiere und die Methode dann ausführe. Benutze ich jedoch den BufferedReader und übergebe den String vom BufferedReader dann der Methode, kriege ich eine NumberFormatException in Zeile 14. 🙁 Aber ich übergebe doch nur Zahlen und keine anderen Zeichen, oder? Hier ist mein Code:

[JAVA=50]
import java.io.*;

/* Programm liest via BufferedReader(FileReader), Zeile für Zeile, eine txt ein.
* Anschließend wird versucht jede Zeile in eine Dezimalzahl umzuwandeln.
*/

public class BinaryParser {

public static int parse(String binaryString) {

try {
if (binaryString.length() < 9) {
int dezimalZahl = Integer.parseInt(binaryString,2);
System.out.print(dezimalZahl);
} else {
throw new InvalidRangeException();
}

} catch (InvalidRangeException e) {
System.out.println("The Value of the input: " + binaryString + " is too long!");
}
return 0;
}



public static void main(String [] args) throws IOException {
//String test= "00000000";
//parse(test);
BufferedReader reader = null;

try {
reader = new BufferedReader(new FileReader("BinaryFile.txt"));
String line;
while ((line = reader.readLine()) != null) {
parse(line);

}
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException i) {
throw new IOException();
}
} reader = null;
}

}
}
[/code]
 
Zuletzt bearbeitet:
meinst du sowas in der Art ?

Java:
 public String parse(String binaryString) throws Exception {

		  			if(Integer.valueOf(Integer.parseInt(binaryString)) <= 0x80){
	            	String dezimalZahl = Integer.toBinaryString(Integer.parseInt(binaryString));
	        
	            	return dezimalZahl;
		  			}
	            	return String.valueOf("0");
	  }
	  
	  public static void main(String[] args) {
		try {
			System.out.println(new Foo().parse("128"));
		} catch (Exception e) {
			// TODO Automatisch generierter Erfassungsblock
			e.printStackTrace();
		}
	}

[EDIT]
hast du per debugger mal geschaut mit was genau dein String beim auslesen aus der datei belegt wird ??
[/EDIT]
 
Zuletzt bearbeitet:
Das mit dem Debugger klingt nach einer guten Idee! Leider habe ich das vorher noch nie gemacht. Habe es gerade mal versucht aber da kommt auch eine eine Fehlermeldung und zwar: "Source not found" und im Detail, exception ClassNotFoundException. :Bahnhof:
Aber im Prinzip ist das was du mir an Code geschickt hast genau meine Idee, danke schonmal dafür, würde nur geratene wissen was mit dem String vom Bufferedreader passiert, bzw. womit der "gefüllt" wird.
 
main Methode vorhanden ? ansonsten poste doch mal bitte den StackTrace, bzw die ganze Fehlermeldung

[TIPP]ich würde auch auf JUnit Tests zugreifen , die "abschnitte" auf funktionsfähigkeit prüfen 🙂[/TIPP]
 
Zuletzt bearbeitet:
Guten Morgen.

Dies ist die Fehlermeldung die mir ausgegeben wird, wenn ich den oben genannten Code ausführe:

Exception in thread "main" java.lang.NumberFormatException: For input string: "0"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:449)
at BinaryParser.parse(BinaryParser.java:14)
at BinaryParser.main(BinaryParser.java:37)

Dabei steht in der .txt nur eine Zeile und in dieser Zeile die null.

Will ich nun über den obigen Code mit dem Debugger (Eclipse), dann steht ganz oben:

Thread [main] (Suspended (exception Class not FoundException)) und ich werde gebeten eine Source anzugeben. Habe schon versucht meinen Projektordner als .jar zu speichern und dann als Source anzugeben, leider hat das auch nicht geholfen.

Vielen Dank, schonmal vorweg, für dein Interesse und die Hilfe!
 
also das kling erstmal nach folgendem :.

Java:
Exception in thread "main" java.lang.NumberFormatException: For input string: "0"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:449)
at BinaryParser.parse(BinaryParser.java:14)
at BinaryParser.main(BinaryParser.java:37)

erstmal die NumberFormatException, also wird was anderes erwartet als du eingibst,

bzw. enstehen in zeile 449 / 14 / 37 / 48 Fehler ( laut der Fehlermeldung beim Parsen )

Das hier bedeutet das eine benötigte klasse die zum ausführen gebraucht wird nicht gefunden wird

Java:
Thread [main] (Suspended (exception Class not FoundException))

poste mal bitte den ganzen Source Code ohne kann man hierzu nicht viel sagen
 
Habe ich doch schon ganz oben, oder kannst du denn etwa nicht sehen?

Aber hier nochmal:
[JAVA=51]
import java.io.*;


/* Programm liest via BufferedReader(FileReader), Zeile für Zeile, eine txt ein.
* Anschließend wird versucht jede Zeile in eine Dezimalzahl umzuwandeln.
*/

public class BinaryParser {

public static int parse(String binaryString) {

try {
if (binaryString.length() < 9) {
int dezimalZahl = Integer.parseInt(binaryString,2);
System.out.print(dezimalZahl);
} else {
throw new InvalidRangeException();
}

} catch (InvalidRangeException e) {
System.out.println("The Value of the input: " + binaryString + " is too long!");
}
return 0;
}



public static void main(String [] args) throws IOException {
//String test= "00000000";
//parse(test);
BufferedReader reader = null;

try {
reader = new BufferedReader(new FileReader("BinaryFile.txt"));
String line;
while ((line = reader.readLine()) != null) {
parse(line);

}
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException i) {
throw new IOException();
}
} reader = null;
}

}
}
[/code]

Hoffe, damit wird einiges klar. 😉
 
[OT]Nur so als kleiner Tipp am Rande:

"try-with-resources" verwenden, dann brauchst du den finally Block nicht und der BufferedReader wird automatisch geschlossen:[/OT]
Java:
try (BufferedReader reader = new BufferedReader(new FileReader("BinaryFile.txt"))) {
  String line;
  while ((line = reader.readLine()) != null) {
    parse(line);
  }
}
 
Zuletzt bearbeitet:
So wie du das da versuchst wird das nichts...

Java:
public static void main(String [] args) throws IOException {
        //String test= "00000000";
        //parse(test);
        BufferedReader reader = null;
                
        try {
            reader = new BufferedReader(new FileReader("BinaryFile.txt"));
            String line;
            while ((line = reader.readLine()) != null) {
                    parse(line);
                
            }
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException i) {
                    throw new IOException();
                }
            } reader = null;
        }
        
    }
}

1. Du erzeugst nirgends in der main methode eine Instanz deines Parsers , welchem du ja dein String übergeben musst?!
Java:
BinaryParser parser = new BinaryParser("Hier muss dein String rein ");

2.in der Zeile hier bin ich mir sicher das es von deiner IDE rot gekennzeichnet werden sollte,

[JAVA=37]
parse(line); // bis zu diesem Zeitpunkt existiert keine BinaryParser Instanz
[/code]

selbst wenn deine Methode
Code:
parse(String s)
static ist
, müsstest du sie in Zeile 37 über Den Klassennamen aufrufen

Java:
BinaryParser.parse(String s);

Vermutlich resultiert daher auch die ClassNotFoundException , da Du die Klasse welche die statische methode beinhaltet nicht angibst, nur weil sich die main Methode in dieser Klasse befindet , musst du in dieser Trotzdem angeben aus welcher Klasse die JVM ( bzw. der Compiler ) deine Methode laden soll.

[TIPP]
Desweiteren würde ich eine Methode / oder eine Klasse Schreiben welche sich um das einlesen der Datei kümmert, und einfach nur den Inhalt an deinen Parser übergibt
[/TIPP]

[EDIT]Die Main Methode würde ich in eine eigenständige Klasse auslagern und nur zum Erzeugen einer Instanz des "FileHandlers" bzw. deines Parsers verwenden, alleine schon um eine gewisse überschaubarkeit zu wahren .[/EDIT]
 
Zuletzt bearbeitet:
Also ich habe jetzt die Main-Methode in eine separate Klasse gesteckt:

Java:
	import java.io.*;

public class ReadIn {

	public static void main(String [] args) throws IOException {
		BufferedReader reader = null;
		
				
		try {
			reader = new BufferedReader(new FileReader("BinaryFile.txt"));
			String line;
			String test = ""; 
			while ((line = reader.readLine()) != null) {			
			test = line;
			}
			
			BinaryParser.parse(test);
			
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException i) {
					throw new IOException();
				}
			} reader = null;
		}
	}
}

Ich habe also mal versucht den String den ich aus dem FileReader bekomme in einen zweiten zu stecken, aber wieder die gleiche Fehlermeldung.

Java:
Exception in thread "main" java.lang.NumberFormatException: For input string: "???0"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
	at java.lang.Integer.parseInt(Integer.java:449)
	at BinaryParser.parse(BinaryParser.java:12)
	at ReadIn.main(ReadIn.java:17)

Die Klasse BinaryParser sieht nun wie folgt aus:

Java:
public class BinaryParser {
 
	public static int parse(String binaryString) {
		
		try {
			if (binaryString.length() < 9) {
			int dezimalZahl = Integer.parseInt(binaryString,2);
			System.out.print(dezimalZahl);
			} else {
				throw new InvalidRangeException();
			}
			
		} catch (InvalidRangeException e) {
			System.out.println("The Value of the input: " + binaryString + " is too long!");
		}
		 return 0;
	}
	
}

Habe übrigens den Debugger ans laufen bekommen, weiß nur nicht wie ich auf den Inhalt des Strings sehen kann. Anscheint übergibt der BufferedReader ja noch irgendwas anderes außer der null, was nicht in ein int gecastet werden kann.
 
Deine ganze Syntax ist irgendwie strange....und du machst es dir viel zu kompliziert , so könnte man das was du vorhast umsetzen ( funktioniert !):

man könnte das ganze auch rekursiv selbst errechnen anstatt die schon vorhandene
Code:
[B]Integer.toBinaryString();[/B]
methode zu verwenden


Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
	
	/**
	 * 
	 * @author kaoZ
	 *
	 */

 
public class BinaryParser {
 
	BufferedReader reader;
	String input;
	
	public BinaryParser(String path) throws Exception {
		reader = new BufferedReader(new FileReader(new File(path)));
		
		input = reader.readLine();
	}
	
	public String parseBinary(){
		
		int bin = Integer.parseInt(input);
		
		return String.valueOf(Integer.toBinaryString(bin));
		
		
	}
	public static void main(String[] args) {
		try {
			System.out.println(new BinaryParser("H:/Apps/Binary.txt").parseBinary());
		} catch (Exception e) {}
	}
}

Ausgabe :

10000000  // 0b128 , 128 Dezimal

[TIPP]Falls du zu dem Code eine erklärung brauchst kann ich dir die gerne geben, dieses Beispiel ist jetz für eine einzelne Zeile in einer Datei, in meinem Beispiel Befindet sich diese Datei in
Code:
H:/Apps/Binary.txt
und enthält in plain Text
Code:
128
dies führt nach Ausführung des Programmes zu der oben stehenden Ausgabe[/TIPP]

[EDIT]
wenn du es für alle Zeilen in einer Datei machen möchtest, kannst du dies wie du es bereits schon gemacht hattest in einer while-schleife einlesen und in einer ArrayList speichern , nicht in einem einzelnen String Objekt, mit einer For-schleife könnte man dann über alle einträge iterieren und für jeden eintrag die methode aufrufen
[/EDIT]
 
Zuletzt bearbeitet:
Ah, ich glaube jetzt habe ich es auch verstanden. Super, vielen Dank, hast mir wirklich sehr geholfen!
Funktioniert nun bei mir und verstanden habe ich es jetzt auch. 😉

Schönen Abend noch!
Kiesen
 
Also ich habe deinen ersten Code bei mir ausprobiert und keinen Fehler bekommen. Er funktioniert genauso wie du ihn gepostet hast.

Ach und wenn du eine statische methode in der selben Klasse aufrufen möchtest in der du gerade bist, brauchst du nicht unbedingt den Klassennamen.methodenNamen() schreiben. Der Methoden name reicht völlig aus...

Kannst du den Fehler reproduzieren? Wenn ja, gibt den binaryString mal mit System.out.print() aus. Bevor versucht wird mit Integer.parseInt() zu parsen.
 

Zurück
Oben