gpt4 book ai didi

Java读取文件的不同方法

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:16 25 4
gpt4 key购买 nike

Java读取文本文件的方式好像有很多很多(BufferedReaderDataInputStream等)我个人最喜欢的是Scanner 在构造函数中使用 File(它更简单,可以更好地处理数学数据,并且具有熟悉的语法)。

Boris the Spider 还提到了 ChannelRandomAccessFile

谁能解释一下这些方法的优缺点?具体来说,我什么时候想使用它们?

(edit) 我想我应该具体一点,并补充说我非常喜欢 Scanner 方法。所以真正的问题是,我什么时候不想使用它?

最佳答案

让我们从头开始。问题是你想做什么?

了解文件的实际含义很重要。文件是光盘上字节的集合,这些字节就是您的数据。 Java 提供了多种抽象级别:

  1. File(Input|Output)Stream - 将这些字节作为 byte 流读取。
  2. File(Reader|Writer) - 从字节流中读取为 char 流。
  3. Scanner - 从 char 流中读取并将其标记化。
  4. RandomAccessFile - 读取这些字节作为可搜索的 byte[]
  5. FileChannel - 以安全的多线程方式读取这些字节。

在每一个上面都有 Decorators ,例如,您可以使用 BufferedXXX 添加缓冲。您可以使用 PrintWriterFileWriter 添加换行意识。您可以使用 InputStreamReaderInputStream 转换为 Reader(目前为 Reader 指定字符编码的唯一方法>).

那么 - 我什么时候不想使用它 [a Scanner]?

如果你愿意,你不会使用Scanner,(这些是一些例子):

  1. 字节的形式读入数据
  2. 读入序列化的 Java 对象
  3. byte 从一个文件复制到另一个文件,可能需要一些过滤。

Scanner(File file) 构造函数获取 File 并使用 platform 打开一个 FileInputStream 也是毫无意义的默认编码 - 这几乎总是一个的想法。人们普遍认为,您应该明确指定编码以避免基于令人讨厌的编码的错误。此外,流没有缓冲。

所以你可能会过得更好

try (final Scanner scanner = new Scanner(new BufferedInputStream(new FileInputStream())), "UTF-8") {
//do stuff
}

丑,我知道。

值得注意的是,Java 7 提供了一个更深层次的抽象层来消除循环文件的需要——这些在 Files 中。类:

byte[] Files.readAllBytes(Path path)
List<String> Files.readAllLines(Path path, Charset cs)

这两种方法都将整个文件读入内存,这可能并不合适。在 Java 8 中,通过添加对新的 Stream API 的支持进一步改进了这一点:

Stream<String> Files.lines(Path path, Charset cs)
Stream<Path> Files.list(Path dir)

例如得到一个Stream Path 中的单词你可以这样做:

    final Stream<String> words = Files.lines(Paths.get("myFile.txt")).
flatMap((in) -> Arrays.stream(in.split("\\b")));

关于Java读取文件的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21817816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com