user459811 user459811 - 2 months ago 13
Java Question

Java: Outputting text file to Console

I'm attempting to output a text file to the console with Java. I was wondering what is the most efficient way of doing so?

I've researched several methods however, it's difficult to discern which is the least performance impacted solution.

Outputting a text file to the console would involve reading in each line in the file, then writing it to the console.

Is it better to use:


  1. Buffered Reader with a FileReader, reading in lines and doing a bunch of system.out.println calls?

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

  2. Scanner reading each line in the file and doing system.print calls?

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



Thanks.

Answer

If you're not interested in the character based data the text file is containing, just stream it "raw" as 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();
}

This saves the cost of unnecessarily massaging between bytes and characters and also scanning and splitting on newlines and appending them once again.

As to the performance, you may find this article interesting. According the article, a FileChannel with a 256K byte array which is read through a wrapped ByteBuffer and written directly from the byte array is the fastest way.

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