【问题标题】:read from a file using BufferedReader, and FileReader使用 BufferedReader 和 FileReader 从文件中读取
【发布时间】:2017-12-01 05:53:47
【问题描述】:

我对 java 比较陌生,对如何使用缓冲阅读器从文件中读取感到好奇。这样做的原因是我正在上课并被分配做一个简单的停止者密码,我应该解密一个文本文件,创建一个新文件,并将解密的文本放入该文件中。我可以使用扫描仪和一个 10KB 的小文件来做到这一点,但是在处理我要测试的 100MB 大文本文件时它非常慢。 这是我应该读取文件内容的代码。

public static void main(String[] args)
{
    BufferedReader br = null;
    FileReader file = null;
    String line = null;
    String all = null;
    try
    {
        file = new FileReader("myfile.txt");
        br = new BufferedReader(file);
        while ((line = br.readLine()) != null) {
            all += line;
        }
    }catch(Exception e)
    {
        System.out.println("nope");
    }
    System.out.println(all);

}

如果有人能指出我正确的方向,那就太好了。

提前致谢

【问题讨论】:

  • all使用StringBuilder而不是String
  • 我也是java新手。但关注“缓冲区阅读器如何工作??”这一点。当我们解密文件时,硬盘中存在的内存通过流传递到 RAM,然后被解密。解密后,我们必须再次发送回硬盘,因为我们必须存储它。因此,为此我们使用文件阅读器,但它工作缓慢并通过流一一发送数据。因此,在缓冲区读取器的帮助下创建了一个缓冲区,这使得 w 传输速度更快,因为它使要发送的数据成为缓冲区。
  • 逐行读取文件,使用java.util.Scanner.hasNextLine()nextLine。它不会将所有行读入内存。教程baeldung.com/java-read-lines-large-file

标签: java file input bufferedreader filereader


【解决方案1】:

流式传输,不要将其读入内存。另外,我更喜欢 try-with-resources (因为你需要关闭你的资源)。并且您可以随时调整缓冲区大小,例如 -

final int size = 1024 * 1024;
try (BufferedReader br = new BufferedReader(new FileReader("myfile.txt"), size)) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line); // <-- stream it
    }
} catch (Exception e) {
    e.printStackTrace();
}

并且永远不要吞下Exception(s) - “不”不是很有帮助。

【讨论】:

    【解决方案2】:

    Java 中的字符串是不可变的,所以每次运行这段代码时

    all += line;
    

    它创建一个新的字符串并分配给所有,使用 StringBuider 或 StringBuffer

    例如

    StringBuilder all = new StringBuilder();
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2018-08-04
      • 2014-05-09
      • 2018-05-15
      • 2023-03-27
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多