Java: вывод текстового файла в консоль - PullRequest
2 голосов
/ 08 октября 2010

Я пытаюсь вывести текстовый файл на консоль с Java. Мне было интересно, какой самый эффективный способ сделать это?

Я исследовал несколько методов, однако трудно определить, какое решение с наименьшей нагрузкой влияет на производительность.

Вывод текстового файла на консоль потребует чтения каждой строки в файле, а затем записи его на консоль.

Лучше ли использовать:

  1. Buffered Reader с FileReader, чтение строк и выполнение множества вызовов system.out.println?

    BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\")); 
    while (in.readLine() != null) {
          System.out.println(blah blah blah);          
    }         
    in.close();
    
  2. Сканер читает каждую строку в файле и выполняет вызовы system.print?

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

Спасибо.

Ответы [ 4 ]

4 голосов
/ 08 октября 2010

Если вас не интересуют символьные данные, содержащиеся в текстовом файле, просто передайте их в «сыром» виде в байтах.

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

Это экономит затраты на ненужный массаж между байтами и символами, а также на сканирование и разбиение на новые строки и добавление их еще раз.

Что касается производительности, вы можете найти эту статью интересной. Согласно статье, самый быстрый способ - FileChannel с байтовым массивом 256 КБ, который читается через упакованный ByteBuffer и записывается непосредственно из байтового массива.

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();
}
3 голосов
/ 08 октября 2010

Если все, что вы хотите сделать, это напечатать содержимое файла (и не хотите печатать следующий int / double / и т.

Ваш код, как он есть, не даст желаемого результата. Попробуйте вместо этого:

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

Я бы не стал слишком зацикливаться на этом, хотя, скорее всего, главным узким местом будет способность вашей консоли печатать информацию, которую посылает Java.

2 голосов
/ 08 октября 2010

Если все, что вам нужно, - это наиболее эффективный вывод содержимого файла на консоль без промежуточной обработки, преобразование данных в символы и поиск разрывов строк не требуют дополнительных затрат. Вместо этого вы можете просто прочитать блоки байтов из файла и записать их прямо в 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 */ }
        }
    }
}

Если вы раньше не сталкивались с подобными идиомами, оператор в условии while назначает результат bis.read для bytesRead, а затем сравнивает его с -1. Поэтому мы продолжаем читать байты в буфер, пока нам не сообщат, что мы находимся в конце файла. И мы используем bytesRead в System.out.write, чтобы убедиться, что мы записываем только те байты, которые только что прочитали, поскольку мы не можем предполагать, что все файлы кратны 8 КБ!

1 голос
/ 21 сентября 2016

Если это сравнительно небольшой файл, способ Java 7+ в одну строку сделать это:

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

См. https://docs.oracle.com/javase/7/docs/api/java/nio/file/package-summary.html для получения более подробной информации.!

...