2012-04-08 6 views
12

Weiß jemand zufällig, ob es einen Unterschied in Bezug auf die Leistung zwischen den beiden Methoden zum Lesen der Eingabedatei unten gibt? Danke.Scanner vs InputStreamReader

1) eine Datei mit Scanner lesen und mit Input und Fileinputstream

InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt")); 
+1

Verwandte: http://StackOverflow.com/Questions/2231369/Scanner-VS-BufferedReader –

+0

Verwandt: [Scanner v. StreamTokenizer] (http://StackOverflow.com/a/2082174/230513). – trashgod

Antwort

7

Der erste Punkt ist, dass weder dieser Code-Beispiele eine Datei lesen. Das klingt vielleicht doof oder falsch, aber es ist wahr. Was sie tatsächlich tun, ist eine Datei zum Lesen öffnen. Und in Bezug auf das, was sie tatsächlich tun, gibt es wahrscheinlich keinen großen Unterschied in ihrer jeweiligen Effizienz.

Wenn es darum geht, die Datei tatsächlich zu lesen, hängt der beste Ansatz davon ab, was die Datei enthält, in welcher Form die Daten für Ihre In-Memory-Algorithmen usw. sein müssen. Dadurch wird bestimmt, ob es besser ist zu verwenden Scanner oder eine rohe Reader, von einer Leistungsperspektive und wichtiger aus der Perspektive, Ihren Code zuverlässig und wartbar zu machen.

Schließlich besteht die Möglichkeit, dass dies keinen wesentlichen Einfluss auf die Gesamtleistung Ihres Codes hat. Was ich sage ist, dass Sie Ihre Anwendung vorzeitig optimieren. Sie sollten die Leistung vorerst ignorieren und die Version auswählen, die den Rest Ihres Codes vereinfacht. Wenn die Anwendung funktioniert, profilieren Sie sie mit einigen repräsentativen Eingabedaten. Die Profilerstellung zeigt Ihnen an, wie viel Zeit für das Lesen der Datei in absoluten Zahlen und für den Rest der Anwendung aufgewendet wird. Dies wird Ihnen sagen, ob es lohnt die Mühe zu versuchen, um das Lesen der Datei zu optimieren.

Das einzige bisschen von Leistungsratschläge, die ich geben würde, ist, dass Buchstabe für Buchstabe, der von einem ungepufferten Eingabestrom oder Leser liest, ineffizient ist. Wenn die Datei auf diese Weise gelesen werden muss, sollten Sie dem Stapel einen BufferedReader hinzufügen.

2

einen Unterschied, und der Haupt

Scanner input = new Scanner(new File("foo.txt")); 

2) Lesen einer Datei Datei, glaube ich, ist, dass mit der BufferedReader/InputStreamReader Sie können das ganze Dokument Zeichen für Zeichen lesen, wenn Sie möchten. Mit Scanner ist dies nicht möglich. Dies bedeutet, dass Sie mit dem InputStreamReader mehr Kontrolle über den Inhalt des Dokuments haben können. ;)

+2

Diese Antwort bezieht sich jedoch nicht auf die Leistung, was das OP forderte. –

+0

@AdamMihalcin Wenn Ihr Punkt ist, dass die Antwort wenn Off-Topic stimme ich nicht zu. Er möchte etwas über die Leistung erfahren und lernt auch den Unterschied zwischen den beiden kennen, der letztlich nur seinem Verständnis des Unterschieds zwischen den beiden zugute kommt. – Joop

3

In Bezug auf die Leistung ist Scanner definitiv der langsamere, zumindest aus meiner Erfahrung. Es ist zum Parsen gedacht, nicht zum Lesen riesiger Datenblöcke. InputStreamReader, mit einem Puffer, der groß genug ist, kann mit BufferedReader, das ich einige Male schneller als Scanner für das Lesen von einer Wörterbuchliste bin, in gleicher Weise ausführen. Here's a comparison between BufferedReader and InputStreamReader. Denken Sie daran, dass BufferedReader ein paar Mal schneller ist als Scanner.