Java Scanner(Datei) daneben benehmen, aber Scanner(FIleInputStream) arbeitet immer mit der gleichen Datei
Ich habe ein komisches Verhalten mit Scanner. Es wird die Arbeit mit einem bestimmten Satz von Dateien, die ich benutze, wenn ich den Scanner(FileInputStream)
Konstruktor, aber es wird nicht mit der Scanner(File)
Konstruktor.
Fall 1: Scanner(File)
Scanner s = new Scanner(new File("file"));
while(s.hasNextLine()) {
System.out.println(s.nextLine());
}
Ergebnis: keine Ausgabe
Fall 2: Scanner(FileInputStream)
Scanner s = new Scanner(new FileInputStream(new File("file")));
while(s.hasNextLine()) {
System.out.println(s.nextLine());
}
Ergebnis: der Inhalt der Datei-Ausgaben an die Konsole.
In der input-Datei ist eine java-Datei, die eine einzelne Klasse.
Ich doppelt geprüft, programmgesteuert (in Java), dass:
- die Datei vorhanden ist,
- lesbar ist,
- und hat einen nicht-null-Größe.
In der Regel Scanner(File)
funktioniert für mich in diesem Fall, ich bin nicht sicher, warum es nicht jetzt.
- Was macht die Datei enthalten?
- Und das ist der einzige code, oder gibt es andere Dinge, die geschehen rund um alles, was? Das snippet scheint unvollständig ist, wie es wäre, zumindest einige exception-handling statt. Könnten Sie uns den ganzen code?
- Interessante Frage. Bitte poste deinen aktuellen code und einen pastebin mit Ihrer Datei. Auch, was ist der output von
Charset.defaultCharset()
auf Ihrem system? - Dachte ich auch, aber die Quelle der Scanner scheint anzudeuten, dass Sie verwenden die default-Zeichensatz in beiden Fällen, wenn nicht mit einem Konstruktor, der würde angeben, es ausdrücklich.
- Ah, ein weiteres sehr wichtig der follow-up-Frage: was ist die Größe der Datei?
- Ich habe aktualisiert mein original-Beitrag zu haben, der code kopiert aus meinem Quellcode-Datei. Nur als test, ich bin das Lesen der Datei und die Ausgabe an das terminal. Die Datei ist eine java-Quelldatei Formular ein open-source-Projekt. Mein Zeichensatz ist UTF-8. Die Größe der Datei ist 18357 bytes.
- Größe spielt keine Rolle, schau unten meine Antwort (ich fand heraus, wie es passiert, nicht, warum eigentlich)
- Wow, ich war gerade das umgekehrte problem (funktioniert mit
File
, nicht mitFileInputStream
). Ich weiß nicht, ob es Verwandte, aber +1 dennoch. Verschwendet eine gute Stunde auf dieser.
Du musst angemeldet sein, um einen Kommentar abzugeben.
hasNextLine() Anrufe findWithinHorizon() welche wiederum ruft findPatternInBuffer(), Suche ein Spiel für einen zeilenabschluss-Zeichen Muster definiert als
.*(\r\n|[\n\r\u2028\u2029\u0085])|.+$
Merkwürdige ist, dass mit beiden Möglichkeiten, so konstruieren Sie einen Scanner (mit FileInputStream oder per Datei), findPatternInBuffer gibt eine positive übereinstimmung, wenn die Datei enthält (unabhängig von der Datei-Größe) für etwa die 0x0A line terminator, aber in dem Fall die Datei enthält ein Zeichen aus der ascii (ie >= 7f), mit FileInputStream gibt true zurück, während der Verwendung der Datei und gibt false zurück.
Sehr einfachen Testfall:
erstellen Sie eine Datei, die enthält nur der char "a"
Bearbeiten Sie jetzt die Datei mit hexedit zu:
in das testen von java code es ist nichts anderes als das, was bereits in der Frage:
SO, es stellt sich heraus, das ist ein charset-Problem. In der Tat, ändern Sie den test auf:
erhalten wir:
Scanner
contrustors Sie scheinen alle zu sein, vorausgesetzt, die Standard-charset-wenn nicht angegeben, es gibt noch ein Unterschied bei der Laufzeit, wie Sie betonen. Vielleicht ist der Kanal wird intern vielleicht zwingen, eine andere, eine Ebene tiefer? Ich Frage mich,... Werde versuchen zu überprüfen, wenn ich eine chance bekomme.Aus der Betrachtung der Oracle/Sun-JDK Versionen 1.6.0_23 Implementierung von Scanner, die
Scanner(Datei)
Konstruktor ruft eineFileInputStream
, die bedeutete für die binären Rohdaten.Deutet dies auf einen Unterschied in der Pufferung und parsing-Technik, die verwendet wird beim Aufruf eines Konstruktors oder einer anderen, die direkten Einfluss auf Ihren code für den Aufruf
hasNextLine()
.Scanner(InputStream)
verwendet eineInputStreamReader
währendScanner(Datei)
verwendet eineInputStream
übergebenByteChannel
(und wahrscheinlich liest die gesamte Datei in einem Sprung, so schreitet Sie den cursor in Ihrem Fall).ArrayList
zum Beispiel (und Nein, Sie sind nicht genau identisch).