java.util.Scanner und NoSuchElementException



  • Ich habe einen Scanner, da übergebe ich ein java.io.File an den Konstruktor. Wenn ich nun ein Byte auslesen möchte, schlägt das sofort fehl, obwohl der Dateiname richtig übergeben wurde und die Größe 863329 Bytes groß ist.

    class parser{
    ...
    
    	private void parse_three_bytes(byte array[], Scanner scanner){
    
    		if(scanner.hasNextByte()){
    			array[0] = scanner.nextByte();
    ...
    		}
    
    		else
    			throw new RuntimeException("Invalid GIF format");
    	}
    
    	public void parse(String file_path) throws FileNotFoundException{
    		Scanner scanner = new Scanner(new File(file_path));
    
    		parse_three_bytes(signature, scanner);
    ...
    	}
    }
    

    Es wird eine RuntimeException geworfen, in Zeile 12. Was mach ich falsch mit dem Scanner?



  • Wieso scanner?
    Scanner liest bis zum nächsten delimiter (default ws).
    Ein Gif fängt doch so an: "GIF...".



  • Jockelx schrieb:

    Scanner liest bis zum nächsten delimiter (default ws).
    Ein Gif fängt doch so an: "GIF...".

    Deshalb ja auch nextByte() .
    Das, was du meinst ist next() .

    Ich habe versucht mit dem Scanner ein nextByte() zu machen, direkt nachdem ich den Scanner angelegt habe, doch bekomme direkt die NoSuchElementException, obwohl die Datei 863329 Bytes groß ist. Als wäre mein Stream trotzdem leer.



  • Hat jetzt mit einem RandomAccessFile geklappt.
    Mich würde aber interessieren warum der Scanner fehlschlug?



  • Kohlensalbe schrieb:

    Mich würde aber interessieren warum der Scanner fehlschlug?

    Das was Jockelx geschrieben hat stimmt schon. Die Scanner Klasse ist für Text parsing gedacht. Das nextByte() liest bis zum nächsten delimiter und versucht die Zeichen als Zahl zu parsen und in ein byte zu schreiben. Wenn dein File mit "100 " anfangen würde ginge das. Aber "GIF..." ist keine Zahl und daher schlägt es fehl.



  • Für Binärdateien (bzw. Binärdaten) solltest du evtl. besser andere Klassen benutzen, s. z.B. Reading and writing binary files.

    Probier mal DataInputStream (welches das Interface DataInput implementiert).