【问题标题】:Efficient Way to Read a File Java [closed]读取文件 Java 的有效方法 [关闭]
【发布时间】:2014-03-30 20:02:30
【问题描述】:

从文件中读取输入的最有效方法是什么?

我有一个非常大的文件,其中包含一个由换行符分隔的单词列表

例如

computer
science 
is 
fun
really

我正在考虑使用 BufferedReader 对象,但是我对文档中的这一行感到困惑。

“一般来说,由 Reader 发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议将 BufferedReader 包装在 read() 操作可能成本高昂的任何 Reader 周围,例如 FileReaders 和 InputStreamReaders。例如,

BufferedReader in = new BufferedReader(new FileReader("foo.in"));

将缓冲来自指定文件的输入。如果没有缓冲,每次调用 read() 或 readLine() 都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。 "

有人可以向我解释一下吗? 在第二次阅读时,我开始相信BufferedReader 是我最好的选择。有没有更好的办法?

【问题讨论】:

  • 该建议与文件大小无关。
  • 请阅读this answer 我写了另一个问题。您误解了 BufferedReader 是什么。这是一个decorator,它实际上并没有读取任何东西。
  • 解释一下什么?你有什么不明白的?

标签: java file bufferedreader


【解决方案1】:

This post 可能会有所帮助。

BufferedReader 是一个不错的选择,让您可以在 Java 8 中将 BufferedReader 转换为 java.util.Stream。

解析大型 CSV 文件,例如使用 java.util.stream 包:

InputStream is = new FileInputStream(new File("persons.csv"));
BufferedReader br = new BufferedReader(new InputStreamReader(is));

List<Person> persons = br.lines()
    .substream(1)
    .map(mapToPerson)
    .filter(person -> person.getAge() > 17)
    .limit(50)
    .collect(toList());

与集合不同,集合是在其中保存元素的内存数据结构,流允许并行处理,其行为类似于按需计算元素的固定数据结构。 此外,Streams 还支持流水线和内部迭代。

【讨论】:

  • +1 Streams 更酷,并且不会比仅使用循环慢太多。
  • 谢谢@ludo_rj。快速提问。用 InputStreamReader 和 FileReader 包装 BufferedReader 有什么优势?
  • FileReader 阻止设置编码(即平台相关)。 InputStream 不限于文件,它允许处理各种来源,如网络连接和许多其他来源......
  • Stream 类型的方法 substream(int) 未定义,是否已弃用?
  • 这个方法从substream重命名为skip。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多