Saul's blog Saul's blog
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)

Saul.J.Wu

立身之本,不在高低。
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)
  • Java入门基础

  • Java核心基础

    • 多线程

    • Java常用类

    • 枚举类与注解

    • Java集合

    • 数据结构与算法

    • 泛型

    • IO流

      • IO流概述
      • File对象
      • InputStream
      • OutputStream
      • Filter模式
      • 操作Zip
      • 读取classpath资源
      • 序列化
      • Reader
      • Writer
      • 转换流
      • PrintStream和PrintWriter
      • RandomAccessFile
      • Files工具类
        • 前言
        • NIO概述
        • NIO.2
        • Path接口
        • Files类
        • 小结
    • 网络编程

    • 反射

    • 函数式编程

  • 设计模式

  • Web开发

  • SpringBoot

  • 微服务

  • Elasticsearch

  • 运维

  • 后端
  • Java核心基础
  • IO流
SaulJWu
2021-01-07

Files工具类

# 前言

从Java 7开始,提供了Files和Paths这两个工具类,能极大地方便我们读写文件。

在了解这两个工具类之前,我们先了解一下nio。nio是新的IO API,它是非阻塞的,原先之前我们学的IO都是阻塞的,后面网络编程就会体现出来。

# NIO概述

Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。

Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。

  • java.nio.channels.Channel

    • |-----FileChannel:处理本地文件
    • |-----SocketChannel:TCP网络编程的客户端的Channel
    • |-----ServerSocketChannel:TCP网络编程的服务器端的Channel
  • |-----DatagramChannel:UDP网络编程中发送端和接收端的Channel

io都是基于流实现的,而nio都是基于Channel实现的。

# NIO.2

随着JDK 7 的发布,Java对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为NIO.2。因为NIO 提供的一些功能,NIO已经成为文件处理中越来越重要的部分。

早期的Java只提供了一个File类来访问文件系统,但File类的功能比较有限,所提供的方法性能也不高。而且,大多数方法在出错时仅返回失败,并不会提供异常信息。

NIO. 2为了弥补这种不足,引入了Path接口,代表一个平台无关的平台路径,描述了目录结构中文件的位置。Path可以看成是File类的升级版本,实际引用的资源也可以不存在。

  • 以前的IO操作都是这样写的:
File file = new File("index.html");
1
  • 现在Java7 中,我们可以这样写:
Path path = Paths.get("index.html");
1

同时,NIO.2在java.nio.file包下还提供了Files、Paths工具类,Files包含了大量静态的工具方法来操作文件;Paths则包含了两个返回Path的静态工厂方法。

Paths 类提供的静态get() 方法用来获取Path 对象:

  • static Path get(String first, String ... more): 用于将多个字符串串连成路径
  • static Path get(URI uri): 返回指定uri对应的Path路径

# Path接口

下面是Path常用接口

  • String toString():返回调用Path 对象的字符串表示形式
  • boolean startsWith(String path) : 判断是否以path 路径开始
  • boolean endsWith(String path) : 判断是否以path 路径结束
  • boolean isAbsolute() : 判断是否是绝对路径
  • Path getParent() :返回Path对象包含整个路径,不包含Path 对象指定的文件路径
  • Path getRoot() :返回调用Path 对象的根路径
  • Path getFileName(): 返回与调用Path 对象关联的文件名
  • int getNameCount(): 返回Path 根目录后面元素的数量
  • Path getName(int idx): 返回指定索引位置idx 的路径名称
  • Path toAbsolutePath(): 作为绝对路径返回调用Path 对象
  • Path resolve(Path p):合并两个路径,返回合并后的路径对应的Path对象
  • File toFile(): 将Path转化为File类的对象
    • Path toPath():File也可以转换为Path类的对象。

# Files类

java.nio.file.Files 用于操作文件或目录的工具类。

例如,我们要把一个文件的全部内容读取为一个byte[],可以这么写:

byte[] data = Files.readAllBytes(Paths.get("/path/to/file.txt"));
1

如果是文本文件,可以把一个文件的全部内容读取为String:

// 默认使用UTF-8编码读取:
String content1 = Files.readString(Paths.get("/path/to/file.txt"));
// 可指定编码:
String content2 = Files.readString(Paths.get("/path/to/file.txt"), StandardCharsets.ISO_8859_1);
// 按行读取并返回每行内容:
List<String> lines = Files.readAllLines(Paths.get("/path/to/file.txt"));
1
2
3
4
5
6

写入文件也非常方便:

// 写入二进制文件:
byte[] data = ...
Files.write(Paths.get("/path/to/file.txt"), data);
// 写入文本并指定编码:
Files.writeString(Paths.get("/path/to/file.txt"), "文本内容...", StandardCharsets.ISO_8859_1);
// 按行写入文本:
List<String> lines = ...
Files.write(Paths.get("/path/to/file.txt"), lines);
1
2
3
4
5
6
7
8

此外,Files工具类还有copy()、delete()、exists()、move()等快捷方法操作文件和目录。这里就不一一展开去测试了,等后面学到框架时,需要用到时,再来查看API足以。

最后需要特别注意的是,Files提供的读写方法,受内存限制,只能读写小文件,例如配置文件等,不可一次读入几个G的大文件。读写大型文件仍然要使用文件流,每次只读写一部分文件内容。

# 小结

对于简单的小文件读写操作,可以使用Files工具类简化代码。

帮我改善此页面 (opens new window)
#NIO
上次更新: 2021/01/10, 04:14:07
RandomAccessFile
网络编程基础

← RandomAccessFile 网络编程基础→

最近更新
01
zabbix学习笔记二
02-28
02
zabbix学习笔记一
02-10
03
Linux访问不了github
12-08
更多文章>
Theme by Vdoing | Copyright © 2020-2022 Saul.J.Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式