Java: Вывод текстового файла в консоль
-
28-09-2019 - |
Вопрос
Я пытаюсь вывести текстовый файл на консоль с Java. Мне было интересно, каков самый эффективный способ сделать это?
Тем не менее, я исследовал несколько методов, трудно определить, что является наименее влияющим на эффективность решения.
Вывод текстового файла на консоль будет включать чтение в каждой строке в файле, а затем записывать его в консоль.
Лучше использовать:
Буферизованный читатель с Fileheader, чтение в строках и делать кучу system.out.println звонки?
BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\")); while (in.readLine() != null) { System.out.println(blah blah blah); } in.close();
Сканер, чтение каждую строку в файле и выполняя вызовы 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. Больше подробностей.
Ваше здоровье!