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

Java:将文本文件输出到控制台,java,file-io,console,bufferedreader,Java,File Io,Console,Bufferedreader,我正试图用Java将文本文件输出到控制台。我想知道这样做最有效的方法是什么 我研究了几种方法,但很难确定哪种方法对性能影响最小 将文本文件输出到控制台需要读取文件中的每一行,然后将其写入控制台 是否最好使用: 带文件读取器的缓冲读取器,在线读取并执行一系列system.out.println调用 BufferedReader in = new BufferedReader(new FileReader("C:\\logs\\")); while (in.readLine() != null)

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

我研究了几种方法,但很难确定哪种方法对性能影响最小

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

是否最好使用:

  • 带文件读取器的缓冲读取器,在线读取并执行一系列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);   
    }
    

  • 谢谢。

    如果您只想在控制台上打印文件内容(不想打印下一个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发送的信息的能力。

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

    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();
    }
    
    这节省了字节和字符之间不必要的信息处理,以及在换行符上扫描和拆分并再次追加它们的成本

    至于表演,你可能会觉得有趣。根据这篇文章,使用256K字节数组的a是最快的方法,该数组通过一个包装的文件读取,并直接从字节数组写入

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

    如果您只想最有效地将文件内容转储到控制台,而中间不进行任何处理,那么将数据转换为字符并查找换行符是不必要的开销。相反,您可以从文件中读取字节块,然后直接写入
    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-in-System.out.write来确保只写入刚才读取的字节,因为我们不能假设所有文件的长度都是8KB的倍数

    如果它是一个相对较小的文件,一种单行Java 7+方法是:

    System.out.println(new String(Files.readAllBytes(Paths.get("logs.txt"))));
    
    有关更多详细信息,请参阅


    干杯

    对于Java 11,您可以使用更方便的方法:

    FileInputStream input = new FileInputStream("D:\\Java\\output.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();
        }
    
    
        Path temp = Files.move 
                (Paths.get("D:\\\\Java\\\\output.txt"),  
                Paths.get("E:\\find\\output.txt")); 
    
                if(temp != null) 
                { 
                    System.out.println("File renamed and moved successfully"); 
                } 
                else
                { 
                    System.out.println("Failed to move the file"); 
                } 
    
    }
    
    Files.copy(Path.of("file.txt"), System.out);
    
    或要获得更快的输出:

    var out = new BufferedOutputStream(System.out);
    Files.copy(Path.of("file.txt"), out);
    out.flush();
    

    在路径名中应该使用斜杠(
    /
    )。Java将把它转换为操作系统特定的分隔符。这正是我想要的,谢谢!:)如果文件和输出目标使用不同的字符编码,则传输原始的“是”将产生奇怪的结果(似乎已中断)。@Raedwald:没错。这不再是服务器的错误(前提是头是正确的),而是客户端的错误,因此通常更容易修复。