使用Java 8,最推荐且简洁的打印文件所有行的方法是什么?

12

在使用新的Java 8版本中,打印文件中所有行最受欢迎和简洁的方法是什么?

输出必须与文件一模一样,每行都要复制:

[Line 1 ...]
[Line 2 ...]

这个问题涉及到Java-8与lambda,即使在旧版本中也有完成它的方法。展示一下Java-8都包括哪些内容!


因为任务是在Java程序中完成的。显然,如果您在MS-DOS或BASH中,cat文件是有效的。但您已经知道了 :) - The Coordinator
3个回答

27

这个示例使用了新的Stream和try语句块中的lambda表达式。

我认为这是最受欢迎且简洁的方式,因为:

1)当完成时,它将自动关闭流并正确抛出任何异常。

2)这种方法输出是惰性的。每一行都是在处理完上一行后才被读取的。 这也更接近于原始的Java基于流的文件处理规范。

3)它以最接近文件中数据的方式打印每一行。

4)这种方法使用的内存较少,因为它不会创建像Files.readAllLines(...)这样的中间列表或数组。

5)这是最灵活的,因为提供的Stream对象有许多其他用途和函数,可以用于处理数据(转换、集合、谓词等)。

 try (Stream<String> stream = Files.lines(Paths.get("sample.txt"),Charset.defaultCharset())) {
            stream.forEach(System.out::println);
 }
如果提供了路径和字符集,并且消费者可以接受任何对象,则这也可以工作:
 try (Stream stream = Files.lines(path,charset)) {
            stream.forEach(System.out::println);
 }

带有错误处理:

 try (Stream<String> stream = Files.lines(Paths.get("sample.txt"),Charset.defaultCharset())) {
            stream.forEach(System.out::println);
 } catch (IOException ex) {
        // do something with exception
 } 

1
CloseableStream 已经从最新的 Java 8 版本中移除。但是,所有的流都是 AutoCloseable 的,因此它们仍然可以与 try-with-resources 结构一起使用。你只需要知道哪些流确实需要关闭即可。 - Stuart Marks
谢谢提供的信息。我已经改用Stream了。 - The Coordinator

11

你不一定需要Java 8:

System.out.println(Files.readAllLines(path, charset));

如果你真的想使用流或需要更简洁的表现:

Files.readAllLines(path, charset).forEach(System.out::println);

1
当然,那些方法可行。感谢您展示了一些替代方式。然而,问题是使用Java 8的最佳方式--而不是是否需要Java 8。现在,您的答案首先读取所有行,而Java 8方法是惰性的,因此更安全。此外,使用Files.readAllLines(..)返回一个数组或列表,并且打印它很丑陋,与逐行打印文件不同。因此,为了保持最受欢迎和传统的读取文件的行为,并将其打印出来,Java 8方法看起来最好。 - The Coordinator
4
第二段代码片段解决了难看的打印问题。至于懒惰程度,这取决于您的使用情况 - 如果文件不太大,则不是真正必需的。个人情况可能有所不同。 - assylias
非常正确,如果我不是那么龟毛的话,我会说你的第二种方法是最容易编码的。我真的很喜欢新的Streams API,它有一些方便的功能,Java 8提供了这些功能。所以我想这是一个胶着的局面 :) - The Coordinator

5
这里有一个简单的解决方案:
System.out.println( new String(Files.readAllBytes(Paths.get("sample.java"))) );

这个使用Nio 2的解决方案使用了Files类和readAllBytes方法,在以前的任何回答中都没有提供! gknicker,你的评论中有一个错误。 - Nery Jr
readAllLines 不是 readAllFiles,而且 new String() 也可以带一个 Charset 参数。 - David Moles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接