java nio path_JAVA基础知识之NIO.2——Path,Paths,Files

本文介绍了Java 7中NIO.2对文件系统IO编程的改进,包括Path接口和Files工具类的使用。Path接口提供与平台无关的路径表示,Files工具类则封装了大量文件操作,如复制、读写和属性检查。通过实例演示了如何在代码中应用这些新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NIO.2

JDK7对NIO进行了重大改进,主要包含以下两方面

新增Path接口,Paths工具类,Files工具类。 这些接口和工具类对NIO中的功能进行了高度封装,大大简化了文件系统的IO编程。

基于异步Channel的IO

在NIO基础上改进后的IO被称为NIO.2 , 上面第一个改进包含在java.nio下新增的包java.nio.file包。 第二个改进包含在原有的java.nio.channels下,新增了多个Aysnchronous开头的channel接口和类。

本文暂时只讨论第一个改进,基于异步Channel的IO将在网络通信中讨论。

Path接口

在java.io及java.nio中,是通过File类来访问文件系统(文件和目录都用File类表示),但是File类不能利用特定文件系统的特性,且性能不高,抛出的异常也太抽象,因此在NIO.2中引入了Path接口。

Path接口表示的是一个与平台无关的路径(文件和目录都用Path表示)。

Path类中包含了常用的操作路径的方法,

getRoot()  -Path对象的跟路径

toAbsolutePath() -Path对象的绝对路径

getNameCount()  -Path对象里包含的路径数量

Paths工具类

Paths工具类包含了两个返回Path对象的静态方法。

static Path get(URI uri) 直接通过路径返回Path对象

static Path get(String first, String...more)通过给出的String字符串组装成一个Path对象

下面演示Paths工具类和Path接口用法,

1 packagenio;2

3 importjava.nio.file.Path;4 importjava.nio.file.Paths;5

6 public classPathTest {7 public static voidmain(String[] args) {8 //在传统java.io中, 文件和目录都被抽象成File对象, 即 File file = new File(".");9 //NIO.2中则引入接口Path代表与平台无关的路径,文件和目录都用Path对象表示10 //通过路径工具类Paths返回一个路径对象Path

11 Path path = Paths.get(".");12 System.out.println("path里包含的路径数量:" +path.getNameCount());13 System.out.println("path的根路径: "+path.getRoot());14 //path的绝对路径15 //对比传统java.io, 取绝对路径 file.getAbsoluteFile()

16 Path absolutePath =path.toAbsolutePath();17 System.out.println("path的绝对路径:");18 System.out.println(absolutePath);19 System.out.println("absolutePath的根路径: "+absolutePath.getRoot());20 System.out.println("absolutePath里包含的路径数量:" +absolutePath.getNameCount());21 System.out.println(absolutePath.getName(3));22 //以多个String来构建path

23 Path path2 = Paths.get("g:", "publish" , "codes");24 System.out.println(path2);25

26

27

28 }29 }

输出如下,

1 path里包含的路径数量:1

2 path的根路径: null

3 path的绝对路径:4 C:\UsersADMIN\PROJECT\CrazyJAVA\PROJECT_JavaBasic\.5 absolutePath的根路径: C:\6 absolutePath里包含的路径数量:6

7 CrazyJAVA8 g:\publish\codes

Files工具类

Files是一个操作文件的工具类,包含了大量静态方法,对旧的IO常用的功能进行了高度封装,例如copty, readAllLines, write, 等等。

在旧的IO中的操作文件的类是File,但是File类只能操作文件(创建,删除,修改属性等),但是不能修改文件的内容。

但是Files工具类可以直接写文件。

File工具类通常需要结合Path对象来使用。 常用方法,

copy(...) 拷贝文件,有3个重载方法,通常需要跟Path结合使用

操作文件

createDirectory(...) 创建目录

createFile(...) 创建文件

delete(Path path) 删除文件

...

判断属性

isHidden(Path path)

isReadable(Path path)

isDirectory(...)

...

读写文件

lines(Path path) 使用默认编码读文件所有行进数组

readAlllines(path ,cs ) 使用指定编码读所有行到数组

write(...) 写文件,可以批量将数组中的数据写入文件,也可以指定编码

walkFileTree() 遍历路径

...

下面演示 Files的用法,

1 packagenio;2

3 importjava.io.FileNotFoundException;4 importjava.io.FileOutputStream;5 importjava.io.IOException;6 importjava.nio.charset.Charset;7 importjava.nio.file.Files;8 importjava.nio.file.Paths;9 importjava.util.ArrayList;10 importjava.util.List;11

12 //Files工具类通常结合Path对象使用

13 public classFileTest {14 public static void main(String[] args) throwsFileNotFoundException, IOException {15 //将传统io读写文件高度封装之后,在NIO.2中拷贝文件只需要调用File工具类的copy()方法

16 Files.copy(Paths.get("tmp.txt"), new FileOutputStream("tmp2.txt"));17 //是否为隐藏文件

18 System.out.println("tmp.txt是否为隐藏文件: "+Files.isHidden(Paths.get("tmp.txt")));19 //一次性读取所有行 , 需要指定编码规则

20 List lines = Files.readAllLines(Paths.get("tmp.txt"), Charset.forName("gbk"));21 System.out.println(lines);22 //文件大小

23 System.out.println("tmp.txt文件大小为: "+Files.size(Paths.get("tmp.txt")));24 List poem = new ArrayList<>();25 poem.add("海阔凭鱼跃");26 poem.add("天高任鸟飞");27 //直接将字符串数组写入文件

28 Files.write(Paths.get("tmp.txt"), poem, Charset.forName("gbk"));29 }30 }

输出结果,

1 tmp.txt是否为隐藏文件: false

2 [海阔凭鱼跃, 天高任鸟飞]3 tmp.txt文件大小为: 24

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值