Java:将文本文件输出到控制台

use*_*811 5 java console file-io bufferedreader

我正在尝试使用 Java 将文本文件输出到控制台。我想知道这样做的最有效方法是什么?

然而,我研究了几种方法,很难辨别哪个是对性能影响最小的解决方案。

将文本文件输出到控制台将涉及读取文件中的每一行,然后将其写入控制台。

是否更好地使用:

  1. 带有 FileReader 的缓冲 Reader,按行读取并执行一堆 system.out.println 调用?

    BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\")); 
    while (in.readLine() != null) {
          System.out.println(blah blah blah);          
    }         
    in.close();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 扫描仪读取文件中的每一行并执行 system.print 调用?

    while (scanner.hasNextLine()) { 
        System.out.println(blah blah blah);   
    }
    
    Run Code Online (Sandbox Code Playgroud)

谢谢。

Cat*_*hwa 5

如果您只想将文件的内容(并且不想打印下一个 int/double/etc.)打印到控制台,那么 aBufferedReader就可以了。

但是,您的代码不会产生您想要的结果。试试这个:

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();
Run Code Online (Sandbox Code Playgroud)

我不会太在意它,因为主要瓶颈更有可能是您的控制台打印 Java 发送它的信息的能力。


Bal*_*usC 4

如果您对文本文件包含的基于字符的数据不感兴趣,只需将其“原始”作为字节进行流式传输即可。

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();
}
Run Code Online (Sandbox Code Playgroud)

这节省了字节和字符之间不必要的处理以及扫描和分割换行符并再次附加它们的成本。

至于性能,您可能会觉得这篇文章很有趣。根据文章,最快的方法FileChannel是通过包装读取 256K 字节数组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();
}
Run Code Online (Sandbox Code Playgroud)