Frage

Ich bin versucht, eine Textdatei auf die Konsole mit Java ausgegeben wird. Ich frage mich, was die effizienteste ist Art und Weise, dies zu tun?

Ich habe jedoch mehrere Methoden erforscht, es ist schwierig, zu erkennen, welche die geringste Leistung beeinflusst Lösung.

Ausgeben einer Textdatei an die Konsole würde in jeder Zeile in der Datei beinhalten lesen, dann ist es an der Konsole zu schreiben.

Ist es besser zu nutzen:

  1. Buffered Reader mit einem Filereader, in den Zeilen zu lesen und eine Reihe von System.out.printin Anrufen zu tun?

    BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\")); 
    while (in.readLine() != null) {
          System.out.println(blah blah blah);          
    }         
    in.close();
    
  2. Scanner jede Zeile in der Datei zu lesen und system.print Anrufe zu tun?

    while (scanner.hasNextLine()) { 
        System.out.println(blah blah blah);   
    }
    

Danke.

War es hilfreich?

Lösung

Wenn Sie in den Charakter basierten Daten nicht interessiert sind die Textdatei enthält, nur streamen es „roh“, wie Bytes.

InputStream input = new BufferedInputStream(new FileInputStream("C:/logs.txt"));
byte[] buffer = new byte[8192];

try {
    for (int length = 0; (length = input.read(buffer)) != -1;) {
        System.out.write(buffer, 0, length);
    }
} finally {
    input.close();
}

Das spart die Kosten für unnötig Massieren zwischen Bytes und Zeichen und auch das Scannen und die Aufteilung auf Zeilenumbrüche und sie erneut angehängt wird.

In Bezug auf die Leistung, können Sie diesem Artikel interessant. Nach dem Artikel, ein FileChannel mit ein 256K Byte-Array, das durch ein eingewickelt ByteBuffer und direkt aus dem Byte-Array geschrieben ist der schnellste Weg.

FileInputStream input = new FileInputStream("C:/logs.txt");
FileChannel channel = input.getChannel();
byte[] buffer = new byte[256 * 1024];
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);

try {
    for (int length = 0; (length = channel.read(byteBuffer)) != -1;) {
        System.out.write(buffer, 0, length);
        byteBuffer.clear();
    }
} finally {
    input.close();
}

Andere Tipps

Wenn alles, was Sie tun wollen, um den Inhalt einer Datei zu drucken (und nicht die nächste int / double / etc drucken möchten.) An die Konsole dann ein BufferedReader ist in Ordnung.

Ihr Code, da es nicht produzieren, ist das Ergebnis Sie nach, though. Versuchen Sie stattdessen:

BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\log001.txt"));
String line = in.readLine();
while(line != null)
{
  System.out.println(line);
  line = in.readLine();
}
in.close();

würde ich nicht sehr hing über sie auf, obwohl, weil es ist wahrscheinlich, dass der Hauptengpass die Fähigkeit der Konsole wird die Informationen zu drucken, dass Java es sendet.

Wenn alles, was Sie wollen, ist am effizientesten die Dateiinhalte an die Konsole ohne Verarbeitung Dump in-between, um die Daten in Zeichen konvertieren und die Suche nach Zeilenumbrüchen ist unnötiger Aufwand. Stattdessen können Sie nur wenige Blocks von Bytes aus der Datei lesen und schreiben dann gerade heraus zu System.out:

package toconsole;

import java.io.BufferedInputStream;
import java.io.FileInputStream;

public class Main {
    public static void main(String[] args) {
        BufferedInputStream bis = null;
        byte[] buffer = new byte[8192];
        int bytesRead = 0;
        try {
            bis = new BufferedInputStream(new FileInputStream(args[0]));
            while ((bytesRead = bis.read(buffer)) != -1) {
                System.out.write(buffer, /* start */ 0, /* length */ bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try { bis.close(); } catch (Exception e) { /* meh */ }
        }
    }
}

Falls Sie haben über diese Art von Idiom vor nicht kommen, die Aussage in der while Bedingung beide weisen das Ergebnis von bis.read zu bytesread und vergleichen sie dann auf -1. Also wir lesen Bytes in den Puffer, bis wir erfahren, dass wir am Ende der Datei sind. Und wir verwenden in System.out.write bytesread, um sicherzustellen, schreiben wir nur die Bytes wir gerade lesen, da wir nicht alle Dateien sind lang ein Vielfaches von 8 kB annehmen kann!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top