2012-03-30 17 views
11

Ich habe zwei Methoden Textdatei in Java ein mit Filereader und andere Datei-InputDie Wahl zwischen Filereader und Input

FileReader fr=new FileReader("C:\\testq\\test.txt"); 
BufferedReader br=new BufferedReader(fr); 
String s; 
while((s=br.readLine())!=null){ 
    System.out.println("value are "+s); 
} 

und andere ist

FileInputStream fstream = new FileInputStream("C:\\testnew\\out.text"); 
DataInputStream in = new DataInputStream(fstream); 
BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
String strLine; 
while ((strLine = br.readLine()) != null){ 
    System.out.println (strLine); 
} 

Obwohl beide geben mir Ausgabe zu lesen ... Ich möchte nur wissen, welches der beste Weg ist, es zu tun.

+1

Der 'DataInputStream' in Ihrem zweiten Beispiel trägt nichts bei: Der Code würde ohne das gleiche funktionieren. – EJP

Antwort

17

Ich würde stark beraten mit InputStreamReader anstelle von FileReader, aber explizit die Zeichencodierung angeben. Das ist wirklich der größte Vorteil der Verwendung von InputStreamReader (und die fehlende Möglichkeit zur Angabe einer Codierung für FileReader ist ein großes Loch in der API, IMO).

Ich würde auch die „Schicht“ mit DataInputStream entfernen - nur die FileInputStream zum InputStreamReader Konstruktor übergeben.

Alternativ können Sie einige der vielen Komfort-Methoden in Guava verwenden, die diese Art der Sache viel einfacher machen können. Zum Beispiel:

File file = new File("C:\\testnew\\out.text"); 
List<String> lines = Files.readLines(file, Charsets.UTF_8)); 
+0

Danke ..es hat funktioniert, aber was genau meinst du mit "explizite Angabe der Zeichenkodierung." .. Bitten können in kleinen Details erklären –

+0

@Sebs_Jedi: Nun, welches Stück davon verstehst du nicht? Momentan rufen Sie den Konstruktor auf, der die Zeichencodierung * default * verwendet, aber Sie können stattdessen einen (UTF-8, UTF-16 usw.) angeben. Es ist * selten * eine gute Idee, die Standard-Kodierung zu verwenden, obwohl Sie natürlich die Kodierung verwenden müssen, in die die Textdatei geschrieben wurde. –

+0

hab es danke. –

-1

Nun erstellen Sie eine BufferedReader vom FileInputStream ursprünglich. Sie sollten es wie folgt tun:

FileInputStream fstream = new FileInputStream("C:\\testnew\\out.text"); 
BufferedInputStream bstream = new BufferedInputStream(fstream); 

Um einen richtigen Stream-Ansatz zu erhalten.

+0

Warum? Er möchte Text lesen, also ist ein * Leser * passender - und ich bezweifle, dass es sich lohnt, explizit in * zwei * Schichten zu puffern. –

+1

Ich meinte nicht, dass er diesen Ansatz für diese Situation verwenden sollte. Ich meinte, dass stream-bezogene Ansatz auf diese Weise verwendet werden muss :) –

+0

-1 als Jon Skeet bezweifelt, dass es nicht gut ist. –

2

Beide Ansätze sind in Ordnung, weil Sie einen BufferedReader verwenden, der die Leistung gegenüber einem No-Buffer-Ansatz stark verbessert. In Ihrem zweiten Fall müssen Sie den FileInputStream nicht in einen DataInputStream einschließen. Der letzte Ansatz, geben Sie die Dateicodierung über den InputStreamReader, die in der Regel eine wichtige Sache ist.

1

Es hängt davon ab, ob Sie eine Datei lesen möchten, die nur Text enthält (ich meine eine Textdatei), dann sollten Sie den ersten Fall verwenden.

Wenn Sie eine Datei lesen möchten, die Binärdaten darstellt (ich meine Bilddatei oder Videodatei usw.), sollten Sie den zweiten Fall verwenden.

+0

danke für die Antwort aber können Sie bitte sagen, welche alternative Methode –

+0

Nein, der Code in der Post verwendet nicht' DataInputStream. readLine' überhaupt. Es verwendet 'BufferedReader.readLine' - schau es dir genau an. –

+0

@Sebs_Jedi hast du es richtig benutzt, dein Code ist absolut zu schreiben. Ich habe das vorher falsch verstanden. Es tut uns leid. –

Verwandte Themen