Java之路:Java 8中关于流的新功能

在Java 8 中的Java.io包和java.nio包中增添了一些方便、实用的操作I/O的方法,这里的nio是java nonblocking input output(非阻塞IO)的简写。

下面简要介绍其中的一些主要方法。

1、Java.io.BufferedReader类中lines()方法。

该方法的原型为:

public Stream<String> lines();

该方法返回一个Stream类型的对象,其中Stream的元素是从BufferedReader流中读出的多行字符串。下面是使用该方法的范例:
【示例1】
在这里插入图片描述

package com.xy.io;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.stream.Stream;

public class LinesTest {
	public static void main(String[] args) throws Exception {
		File file = new File("D:" + File.separator + "1.txt"); // 创建文件对象
		BufferedReader in = new BufferedReader(new FileReader(file)); // 创建输入流
		Stream<String> lines = in.lines();	// 获取文件中的多选数据
		lines.forEach((L)->System.out.println(L));	// 通过forEach输出查看
		in.close();
	}
}

【结果】
在这里插入图片描述

2、java.nio.file.Files 类

public static List<String> readAllLines(Path path) throws IOException

该方法的作用与lines()方法类似,获取一个文件中的多行内容,并以List集合的方法返回。 其中的参数path(java.nio.file.Path)指向的是一个路径,通过File类的toPath()方法可以得到一个这样的对象。下面的范例演示的是该方法的使用。
【示例2】

package com.xy.io;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;

public class AllLinesTest {
	public static void main(String[] args) throws IOException {
		File file = new File("D:" + File.separator + "1.txt"); // 创建文件对象
		List<String> lineList = Files.readAllLines(file.toPath());	// 获得文件中的多行
		for(String s : lineList) {
			System.out.println(s);
		}
	}
}

【结果】
在这里插入图片描述

需要注意的是使用这个方法如果没有指定字符集,则默认为UTF-8,所以如果文件的编码格式不是UTF-8,则可能出现异常(编译无法通过)或乱码

此外,如果文件是UTF-8格式,在处理中文的时候,还会有部分乱码,如下图所示。
在这里插入图片描述
这时,需要将UTF-8格式转换成UTF-8 without BOM格式。BOM(Byte Order Mark)表示的是字节序标记。

UTF- 8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用十六进制文件编辑器(UtraEdit等)打开这个文件,切换到十六进制编辑状态就可以看到开头的FFFE标识。这个标识是用来区分UTF-8编码文件的好办法。上图中的问号”?”就是这个符号无法显示的乱码。

3、java.nio.file.Files 类

public static Stream<Path> walk(Path start,int maxDepth,FileVisitOption... options)
throws IOException

该方法的作用是按照深度优先遍历(traversed depth-first)的原则遍历由start作为根目录的文件结构树。并将遍历的结果存入Stream集合中返回,其中的每一个元素都是Path类型的文件路径。

参数 maxDepth是表示遍历的最大深度,如果是0 ,表示只遍历根目录,即只返回start指定的根目录所对应的Path对象。

如果想要遍历该文件结构中的所有层,则可以将maxDepth参数设置为 Integer. MAX_VALUE。

参数options是一个FileVisitOption类型的值,该类型是枚举类型,仅有一个枚举值-FOLLOW_LINKS 。该参数是可选的。如果不填写该参数,那么在遍历到符号链接文件时不会进入其所链接的文件夹中。如果填写了该参数——FileVisitOption.FOLLOW_LINKS,在遍历到符号链接文件时会进入其所链接的文件夹中继续遍历。

该方法是用的范例如下。

【示例3】

package com.xy.io;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;

public class WalkTest {
	public static void main(String[] args) throws IOException {
		File file = new File("./src"); // 创建文件对象
		// 将文件转换成Path
		Path path = file.toPath();
		// 获取file所对应的根目录文件树中的所有文件
		Stream<Path> filedata = Files.walk(path, Integer.MAX_VALUE, FileVisitOption.FOLLOW_LINKS);
		// 输出查看
		filedata.forEach((p)->System.out.println(p.getFileName()));
		filedata.close();
	}
}

【结果】
在这里插入图片描述
在这里插入图片描述

在 JDK 1.8 中 同 时 提 供 了 一 个:

public static Stream<Path> walk(Path start, FileVisitOption... options) throws IOException

的方法, 这个方法的使用与上面相同, 不同的是maxDepth参数默认为 Integer.MAX_VALUE 。

提示
符号链接(symbolic link):符号链接又叫软连接,是一类特殊的文件,这个文件包含了另一个文件的路径名(绝对路径或者相对路径),路径可以是任意的文件或目录,可以链接到不同文件系统的文件。
链接符号的操作是透明的:对符号链接文件进行读写的程序会表现为直接对目标文件进行操作,某些需要特别处理符号链接文件的程序可能会识别链接文件。在Windows7 中创建链接文件的命令是:mklink , 具体的参数可以再DOS下输入mklink然后回车查看详细介绍。

猜你喜欢

转载自blog.csdn.net/qq_43555323/article/details/84980757