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. 表单的enctype property

    enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码. 默认地,表单数据会编码为 "application/x-www-form-urlencoded".就是说,在 ...

  2. html 抽奖代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 邮件格式(HTML/TXT),TXT为文本邮件

    <?phpclass smtp{/* Public Variables */var $smtp_port;var $time_out;var $host_name;var $log_file;v ...

  4. 增强for循环

    import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Li ...

  5. 【7集iCore3基础视频】7-4 iCore3连接示意图

    iCore3连接示意图: 高清源视频:链接:http://pan.baidu.com/s/1hr7ucpY%20密码:473n iCore3 购买链接:https://item.taobao.com/ ...

  6. Range

    欢迎转载,转载请注明出处,徽沪一郎. 概要 Scala中Range可以看成是List的特例,Range的包含的元素类型是Int, 本文介绍如何创建Range Range创建 方法一: val r1 = ...

  7. ThinkPHP3.2.3 Nginx 下 URL_MODEL 的配置

    ThinkPHP3.2.3 的 URL_MODEL 包括普通模式(0).PATHINFO 模式(1).REWRITE 模式(2).兼容模式(3)等 4 种 URL 模式.在 Apache 下只要在配置 ...

  8. 读过的laravel文章

    Laravel 中使用 JWT(Json Web Token) 实现基于API的用户认证 http://www.tuicool.com/articles/IRJnaa api token https: ...

  9. Mysql新建表,插入中文时报错“Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column”问题

    有时候我们在往数据库中输入信息时,如果输入的内容是中文,会报错“Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column”. 例如: ...

  10. C#中的延迟加载

    什么是延迟加载?   延迟加载顾名思义就是:推迟加载的时机,当真正使用的时候才加载. 通常在创建一个大对象时,有些属性我们可以在使用到的时候才去创建(设置属性的值),这个可以有效的提升系统性能. 示例 ...