1 基本概括
2 主要介绍
2.1 Files常用的方法
long size(Path path) //返回文件大小
boolean isDirectory(Path path) //是否是文件夹
boolean isExecutable(Path path) //是否是可执行文件
boolean isHidden(Path path) //是否是隐藏的
boolean exists(Path path) //该文件/文件夹是否存在
boolean notExists(Path path) //是否不存在
boolean isReadable(Path path) //是否可读
boolean isWritable(Path path) //是否可写
createFile(Path filePath) //创建文件,只能是文件,不能是文件夹。如果已存在同名文件,会报错。
createDirectory(Path dirPath) //创建文件夹。如果已存在同名文件夹,会报错
createTempFile(String prefix, String suffix) //在OS的临时文件夹中创建一个临时文件
createTempFile(Path dir, String prefix, String suffix) //在指定的目录下创建一个临时文件
prefix是文件名前缀,suffix是文件名后缀,一般是扩展名,比如“.zip”。中间会使用系统
生成的一个随机数。返回该临时文件的Path对象(绝对路径)。
createTempDirectory(String prefix) //在OS的临时文件夹中创建一个临时文件夹。
createTempDirectory(Path dir, String prefix) //在指定的目录下创建一个临时文件夹
文件夹名:前缀+一个系统生成的随机数
Files.copy(Path src, Path target) //复制文件,如果存在同名的目标文件,会报错。
Files.copy(Path src, Path target , StandardCopyOption.REPLACE_EXISTING)
//如果存在同名的目标文件,会替换只能是文件,不能是文件夹,要复制文件夹需要递归复制子
文件、子文件夹。目标文件名可与原文件名不同。
Files.move(Path src, Path target) //剪切,如果目标已存在,会报错
Files.move(Path src, Path target , StandardCopyOption.REPLACE_EXISTING) //如果目标已存在,会替换。虽然是move,但常量还是是
StandardCopyOption.REPLACE_EXISTING。可以是文件、文件夹。
在copy()、move()操作中:如果Path的中间部分路径有不存在的,会报错,并不会自动创建。
比如复制一张图片,目标是"D:\\test\\1.png" ,如果test不存在,会报错。
剪切是一种特殊的复制,先复制,复制完成后再删除原文件/文件夹。
Files.delete(Path path) //删除文件、空目录。如果不存在,会报错
Files.deleteIfExists(Path path) //存在才删除,不存在时不会报错。
只能删除文件、空目录。如果该文件夹下包含子文件、子目录,即便子目录是空的,也会报错。
要删除有内容的文件夹,需要递归删除子文件、子文件夹。
读取文件内容:
String Files.readString(Path path) //读取所有文本,以String形式返回。会读取换行符。只能是文本文件
String Files.readString(Path path, Charset charset) //可指定解码字符集
List<String> Files.readAllLines(Path path) //读取所有的行,以LIst<String>形式返回,一行就是一个String类型的元素。只能是文本文件
List<String> Files.readAllLines(Path path, Charset charset) //可指定解码字符集
byte[] Files.readAllBytes(Path path) //读取文件所有数据,以字节数组形式返回。
文件可以是任意类型。
写入文件:
Files.write(Path path, byte[] bytes) //写入一个byte[]
Files.writeString(Path path, CharSequence cs) //写入一个字符序列,可以是String、
StringBuffer、StringBuilder、Char[]
Files.writeString(Path path, CharSequence cs, Charset charset) //指定编码字符集
以上3个方法均可在末尾指定参数个数可变的的可选参数OpenOption,常用的值:
StandardOpenOption.APPEND 追加
StandardOpenOption.READ 读
StandardOpenOption.WRITE 写
StandardOpenOption.SYNC 同步写到磁盘文件
StandardOpenOption.DELETE_ON_CLOSE 关闭时删除文件
参数个数可变,可同时使用多个预定义的值,放在参数表最后面,以逗号分隔。
创建对象:
Files.newBufferedReader(Path path);
Files.newBufferedReader(Path path,Charset charset); //可指定解码字符集
Files.newBufferedWriter(Path path);
Files.newBufferedWriter(Path path, Charset charset); //可指定编码字符集
以上2个方法均可指定参数个数可变的OpenOption。
Files.newInputStream(Path path);
Files.newOutputStream(Path path);
以上2个方法均可指定参数个数可变的OpenOption。
2.2 Pipe原理
Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。
Pipe和channel的区别
pipe是线程间单向通道。channel是服务器和客户端双向通道。
3 简单用例
3.1 通过管道传输数据
@Test
public void test1() throws IOException{
//1. 获取管道
Pipe pipe = Pipe.open();
//2. 将缓冲区中的数据写入到管道
ByteBuffer buf = ByteBuffer.allocate(1024);
Pipe.SinkChannel sinkChannel = pipe.sink();
buf.put("通过单向管道发送数据".getBytes());
buf.flip();
sinkChannel.write(buf);
//3. 读取缓冲区中的数据
Pipe.SourceChannel sourceChannel = pipe.source();
buf.flip();
int len = sourceChannel.read(buf);
System.out.println(new String(buf.array(),0,len));
sourceChannel.close();
sinkChannel.close();
}