在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然后回车查看详细介绍。