NIO.2

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

  1. 新增Path接口,Paths工具类,Files工具类。 这些接口和工具类对NIO中的功能进行了高度封装,大大简化了文件系统的IO编程。
  2. 基于异步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的更多相关文章

  1. JAVA基础知识之NIO——Buffer.Channel,Charset,Channel文件锁

    NIO机制 NIO即NEW IO的意思,是JDK1.4提供的针对旧IO体系进行改进之后的IO,新增了许多新类,放在java.nio包下,并对java.io下许多类进行了修改,以便使用与nio. 在ja ...

  2. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  3. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  4. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  5. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  6. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  7. java基础知识精华

    转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...

  8. java基础知识一览(二)

    一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...

  9. 黑马毕向东Java基础知识总结

    Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记    侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...

随机推荐

  1. sign in和sign up区别

    如果是网站的话sign up是注册,sign in是登录的意思,另外,sign out退出

  2. 2016huasacm暑假集训训练三 C - Til the Cows Come Home

    题目链接:http://acm.hust.edu.cn/vjudge/contest/123674#problem/C N题目大意是有n个点,然后给出从a点到b点的距离,a和b是互相可以抵达的,则是无 ...

  3. 数组遍历map和each使用

    <body> <input type="/> <input type="/> <input type="/> </b ...

  4. unicode可以通过编码(encode)成为特定编码的str

    1.原始字符串python中的原始字符串以r开头,使用原始字符串可以避免字符串中转义字符带来的问题,例如写路径时 path = 'c:\noway',此时用 print path,其结果为:c:owa ...

  5. 如果使用 Excel5 ,输出的内容应该是GBK编码

    下面就是php导出excel的程序 <?phpini_set("display_errors",1);//是否显示报错信息set_include_path(get_inclu ...

  6. 一封给JVM懵懂者的情书【不看错过一生幸福】

    别说你懂我 你只是在意Java你把我留在家里身和心却始终在她那里难道我只是她的附属品?错,我是我,我是JVM,没有我就没有他! 如果你想懂我或者不管你是否懂我我都在这里等你---[深入JVM内核—原理 ...

  7. C输入输出函数与缓冲区

    #转 对C语言输入输出流和缓冲区的深入理解C语言缓冲区(缓存)详解缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的 ...

  8. Android流畅度测试

    Android流畅度测试 测试方法一:系统自带-开发者模式 测试方法二:FPS Meter测试安卓帧数 H5页面加载速度:window.performance.timing 测试方法一:系统自带-开发 ...

  9. [PCL]FPFH描述子

    fpfh_est.setSearchSurface(data); 如果没有设置SearchSurface,使用input数据集作为查找的表面 // If no search surface has b ...

  10. Java Servlet(八):EL自定义函数

    EL自定义函数:在EL表达式中调用的某个java类的静态方法,这个静态方法需在web应用程序中进行配置才可以被EL表达式调用. EL自定义函数可以扩展EL表达式的功能,让EL表达式完成普通java程序 ...