JAVA基础知识之NIO.2——Path,Paths,Files
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接口用法,
package nio; import java.nio.file.Path;
import java.nio.file.Paths; public class PathTest {
public static void main(String[] args) {
//在传统java.io中, 文件和目录都被抽象成File对象, 即 File file = new File(".");
//NIO.2中则引入接口Path代表与平台无关的路径,文件和目录都用Path对象表示
//通过路径工具类Paths返回一个路径对象Path
Path path = Paths.get(".");
System.out.println("path里包含的路径数量:" + path.getNameCount());
System.out.println("path的根路径: "+path.getRoot());
//path的绝对路径
//对比传统java.io, 取绝对路径 file.getAbsoluteFile()
Path absolutePath = path.toAbsolutePath();
System.out.println("path的绝对路径:");
System.out.println(absolutePath);
System.out.println("absolutePath的根路径: "+absolutePath.getRoot());
System.out.println("absolutePath里包含的路径数量:" + absolutePath.getNameCount());
System.out.println(absolutePath.getName(3));
//以多个String来构建path
Path path2 = Paths.get("g:", "publish" , "codes");
System.out.println(path2); }
}
输出如下,
path里包含的路径数量:1
path的根路径: null
path的绝对路径:
C:\UsersADMIN\PROJECT\CrazyJAVA\PROJECT_JavaBasic\.
absolutePath的根路径: C:\
absolutePath里包含的路径数量:6
CrazyJAVA
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的用法,
package nio; import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List; //Files工具类通常结合Path对象使用
public class FileTest {
public static void main(String[] args) throws FileNotFoundException, IOException {
//将传统io读写文件高度封装之后,在NIO.2中拷贝文件只需要调用File工具类的copy()方法
Files.copy(Paths.get("tmp.txt"), new FileOutputStream("tmp2.txt"));
//是否为隐藏文件
System.out.println("tmp.txt是否为隐藏文件: "+Files.isHidden(Paths.get("tmp.txt")));
//一次性读取所有行 , 需要指定编码规则
List<String> lines = Files.readAllLines(Paths.get("tmp.txt"), Charset.forName("gbk"));
System.out.println(lines);
//文件大小
System.out.println("tmp.txt文件大小为: "+Files.size(Paths.get("tmp.txt")));
List<String> poem = new ArrayList<>();
poem.add("海阔凭鱼跃");
poem.add("天高任鸟飞");
//直接将字符串数组写入文件
Files.write(Paths.get("tmp.txt"), poem, Charset.forName("gbk"));
}
}
输出结果,
tmp.txt是否为隐藏文件: false
[海阔凭鱼跃, 天高任鸟飞]
tmp.txt文件大小为: 24
JAVA基础知识之NIO.2——Path,Paths,Files的更多相关文章
- JAVA基础知识之NIO——Buffer.Channel,Charset,Channel文件锁
		
NIO机制 NIO即NEW IO的意思,是JDK1.4提供的针对旧IO体系进行改进之后的IO,新增了许多新类,放在java.nio包下,并对java.io下许多类进行了修改,以便使用与nio. 在ja ...
 - JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
		
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
 - Java基础知识(壹)
		
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
 - Java基础知识回顾之七 ----- 总结篇
		
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
 - Java基础知识总结(超级经典)
		
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
 - 毕向东—Java基础知识总结(超级经典)
		
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
 - java基础知识精华
		
转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...
 - java基础知识一览(二)
		
一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...
 - 黑马毕向东Java基础知识总结
		
Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记 侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...
 
随机推荐
- 关于ASP.NET Web API 客户端的请求报文中添加 Authorization
			
当你使用客户端发送请求 Web API 的时候,因为API 有验证,所以你的请求报文中必须有”Authorization“,那么就需要手动添加了! HttpClient client = new Ht ...
 - ThinkPHP留后门技巧
			
原文链接:https://www.leavesongs.com/PENETRATION/thinkphp-callback-backdoor.html 90sec上有人问,我说了还有小白不会用.去年我 ...
 - centos install zookeeper cluster
			
1.apache官方下载, 2.新版本需要jdk环境,然后配置好jdk环境 3.解压zookeeper,进入解压后的conf,新建zoo.cfg (删掉自带的cfg)内容如下 tickTime=200 ...
 - js 随机数  洗牌算法
			
function shuffle(arr){ var len = arr.length; for(var i = 0;i<len -1;i++) { var idx = Math.floor(M ...
 - js 将一段html插入到body最前面
			
var wrap=document.createElement("div"); var first=document.body.firstChild;//得到页面的第一个元素 va ...
 - DS Tree 已知后序、中序 => 建树 => 求先序
			
注意点: 和上一篇的DS Tree 已知先序.中序 => 建树 => 求后序差不多,注意的地方是在aftorder中找根节点的时候,是从右往左找,因此递归的时候注意参数,最好是拿纸和笔模拟 ...
 - JavaScript方法的调用
			
1.假如是有名字的函数 调用是用名字调用,并且会把返回值赋值给接受它的参数 代码: function f() { alert("我是f"); return '我是返回值'; } f ...
 - 代码规范[iOS]
			
一.文件系统 二.代码结构 三.常量 宏 四.布局方式 数据持久化 五.网络 六.类目.延展 七.内存.线程 八.其他 九.版本控制.上线相关 十.附录1(公共库) 十一.附录2(公共类目) 十二 ...
 - JavaScript特效(调试笔记)
			
JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: function getTime() { var today = new Date() ...
 - DIA
			
Dia Tutorial: http://www.seanet.com/~hgg9140/comp/diatut/all/all.html Dia Tutorial