Вопрос

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

Тем не менее, я исследовал несколько методов, трудно определить, что является наименее влияющим на эффективность решения.

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

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

  1. Буферизованный читатель с Fileheader, чтение в строках и делать кучу 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);   
    }
    

Спасибо.

Это было полезно?

Решение

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

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

Другие советы

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

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

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 отправляет ее.

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

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

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

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

Видеть https://docs.orcle.com/javase/7/docs/api/java/nio/file/package-summary.html. Больше подробностей.

Ваше здоровье!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top