6 Stimmen

java.util.Scanner verwenden, um eine Datei Byte für Byte zu lesen

Ich versuche, eine einzeilige Datei Zeichen für Zeichen mit java.util.Scanner zu lesen. Ich erhalte jedoch diese Ausnahme":

Exception in thread "main" java.util.InputMismatchException: For input string: "contents of my file"
    at java.util.Scanner.nextByte(Scanner.java:1861)
    at java.util.Scanner.nextByte(Scanner.java:1814)
    at p008.main(p008.java:18) <-- line where I do scanner.nextByte()

Hier ist mein Code:

public static void main(String[] args) throws FileNotFoundException {
    File source = new File("file.txt");
    Scanner scanner = new Scanner(source);
    while(scanner.hasNext()) {
        System.out.println((char)scanner.nextByte());
    }
    scanner.close()
}

Hat jemand eine Idee, was ich falsch machen könnte?

Bearbeiten: Mir ist aufgefallen, dass ich hasNext() anstelle von hasNextByte() geschrieben habe. Aber wenn ich das tue, wird nichts ausgedruckt.

11voto

Carl Smotricz Punkte 64366

Warum in aller Welt sollten Sie einen Scanner verwenden, um eine Datei Byte für Byte zu lesen? Das ist, als würde man eine Schubkarre benutzen, um sein Kleingeld zu transportieren. (Wenn Sie wirklich eine Schubkarre für Ihr Kleingeld brauchen, lassen Sie es mich wissen, damit ich Ihr Freund werden kann).

Aber im Ernst: Klasse InputStream liest Bytes aus einer Datei, einfach und zuverlässig, und tut sonst nichts.

Klasse scanner wurde kürzlich in die Java-API aufgenommen, damit Lehrbuchbeispiele Daten aus einer Datei mit weniger Aufwand als bei der üblichen Verwendung der Kaskade von new BufferedReader(new InputStream) . Seine Spezialität ist die Eingabe von Zahlen und Zeichenketten aus Freiform-Eingabedateien. Die Website nextByte() Methode liest eine oder mehrere Dezimalziffern aus dem Eingabestrom (falls vorhanden) und wandelt die so gescannte Zahl in einen einzelnen Byte-Wert um.

Und wenn Sie Bytes lesen, warum wollen Sie sie als char s? Bytes sind pas Zeichen, und die Brute-Force-Konvertierung wird an einigen Stellen fehlschlagen. Wenn Sie die Werte dieser Bytes sehen wollen, drucken Sie sie so aus, wie sie sind, und Sie werden kleine Ganzzahlen zwischen 0 und 255 sehen.

Wenn Sie lesen möchten char s aus einer Datei, FileReader ist der richtige Kurs für Sie.

4voto

Michael Borgwardt Punkte 334642

Der Scanner ist für Parsing Textdaten - seine nextByte() Methode erwartet, dass die Eingabe aus Ziffern besteht (eventuell mit vorangestelltem Vorzeichen).

Sie möchten wahrscheinlich eine FileReader wenn Sie tatsächlich Textdaten lesen, oder eine FileInputStream wenn es sich um binäre Daten handelt. Oder eine FileInputStream eingewickelt in einen InputStreamReader wenn Sie einen Text mit einer bestimmten Zeichenkodierung lesen (leider, FileReader erlaubt es Ihnen nicht, die Kodierung anzugeben, sondern verwendet implizit die Standardkodierung der Plattform, was oft nicht gut ist).

2voto

McDowell Punkte 105255

Bei der Fehlersuche Scanner prüfen, ob [zugrunde liegende E/A-Fehler](http://java.sun.com/javase/6/docs/api/java/util/Scanner.html#ioException()) :

if(scanner.ioException() != null) {
  throw scanner.ioException();
}

Aber ich stimme den anderen zu - das ist wahrscheinlich nicht die richtige Klasse für diesen Job. Wenn Sie Byte-Eingabe wollen, verwenden Sie eine InputStream (in diesem Fall, [FileInputStream](http://java.sun.com/javase/6/docs/api/java/io/FileInputStream.html#read()) ). Wenn Sie eine Zeicheneingabe wünschen, verwenden Sie eine Reader (z.B.. InputStreamReader ).

1voto

Bernhard Barker Punkte 52773

Scanner geht es um das Lesen von abgegrenztem Text (siehe die Dokumente ).

nextByte liest so lange, bis es das von Ihnen angegebene Trennzeichen erreicht (standardmäßig Leerzeichen), und versucht dann, diese Zeichenkette in ein Byte umzuwandeln.

Wenn Sie also 123 456 in einer Datei, ein Aufruf von nextByte wird zurückgegeben 123 , nicht 49 (der Dezimalwert für die 1 Zeichen).


Wenn Sie Byte für Byte lesen möchten, können Sie Folgendes verwenden FileInputStream .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X