Pregunta

Estoy intentando dar salida a un archivo de texto a la consola con Java. Me preguntaba cuál es la manera más eficiente de hacerlo?

He investigado varios métodos, sin embargo, es difícil discernir cuál es el rendimiento de la solución menos afectado.

dar salida a un archivo de texto a la consola implicaría la lectura en cada línea en el archivo, a continuación, escribir a la consola.

¿Es mejor uso:

  1. tamponada con un lector de FileReader, la lectura en las líneas y hacer un montón de llamadas System.out.println?

    BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\")); 
    while (in.readLine() != null) {
          System.out.println(blah blah blah);          
    }         
    in.close();
    
  2. Escáner de leer cada línea en el archivo y hacer llamadas system.print?

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

Gracias.

¿Fue útil?

Solución

Si usted no está interesado en los datos basados ??en caracteres del archivo de texto que contiene es, simplemente transmítelo "en bruto" como 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();
}

Esto ahorra el costo de masaje innecesariamente entre bytes y caracteres y también la exploración y la división de los saltos de línea y añadiéndolos de nuevo.

En cuanto al rendimiento, se puede encontrar interesante este artículo . Según el artículo, un FileChannel con una matriz de 256K bytes, que se lee a través de una envuelta ByteBuffer y escrita directamente desde la matriz de bytes es la manera más rápida.

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();
}

Otros consejos

Si todo lo que quiero hacer es imprimir el contenido de un archivo (y no desea imprimir la siguiente int / doble / etc.) A la consola a continuación, un BufferedReader está muy bien.

Su código, ya que no producirá el resultado que está buscando, sin embargo. Tal vez puedas probar:

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();

yo no se obsesione con ello, sin embargo, porque es más probable que el principal cuello de botella será la capacidad de la consola para imprimir la información de que Java es el envío de la misma.

Si lo que quieres es lo más eficientemente posible volcar el contenido del archivo a la consola sin procesamiento en el medio, convirtiendo los datos en caracteres y la búsqueda de los saltos de línea es una sobrecarga innecesaria. En su lugar, sólo puede leer bloques de bytes desde el archivo y escribir luego directamente a 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 */ }
        }
    }
}

En caso de que no han llegado a través de este tipo de lenguaje antes, la declaración de la condición, mientras que ambos asigna el resultado de bis.read a BytesRead y luego lo compara con -1. Así que seguimos leyendo bytes en el buffer hasta que se nos dice que estamos en el final del archivo. Y utilizamos BytesRead en System.out.write para asegurarse de que sólo escriben los bytes que acabamos de leer, ya que no podemos asumir todos los archivos son un múltiplo de 8 kb de largo!

Si se trata de un archivo relativamente pequeño, una sola línea de Java 7+ manera de hacer esto es:

System.out.println(new String(Files.readAllBytes(Paths.get("logs.txt"))));

https: // docs .oracle.com / archivo / JavaSE / 7 / docs / api / java / nio / package-summary.html para más detalles.

Saludos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top