笔记:I/O流-文件操作
Java库中使用
Path
和
Files
类封装了在用户机器上处理文件系统所需要的所有功能,可以使用Paths来获取一个具体的Path对象,来表示具体的路径。
- 路径
Path表示的是一个目录名序列,其后还可以跟着一个文件名,以根路径开始的路径是绝对路径;否则就是相对路径,示例代码如下:
Path absolute = Paths.get("E:\\", "VirtualMachines", "CentOS 64 位", "CentOS 64 位.vmdk");
System.out.println("absolute path " + absolute);
Path relative = Paths.get("/opt");
System.out.println("relative path " + relative);
组合和解析路径是常见操作,调用
p.resolve(q)将按照下列规则返回一个路径:
- 如果q是绝对路径,则返回结果就是
q - 否则,根据文件系统的规则,将
p
后面跟着
q
作为结果
Path relative = Paths.get("/opt");
System.out.println("relative path " + relative);
Path workRelative = relative.resolve("work");
System.out.println("workRelative path " + workRelative);
输出路径
workRelative
结果为
" \opt\work",还有一个很方便的方法
resolveSibling
,他通过解析指定路径的父路径产生其兄弟路径,示例代码如下:
Path tempPath = workRelative.resolveSibling("temp");
System.out.println("resolveSibling path " + tempPath);
输出路径
tempPath
结果为"\opt\temp",如果需要把路径产生相对路径,可以调用方法
relativize,该方法是返回指定路径之间的相对路径,示例代码如下:
Path relativize = workRelative.relativize(tempPath);
System.out.println("relativize source path \"" + workRelative + "\"
relativize path
\""
+ tempPath + "\"
result path
\"" + relativize + "\"");
输出结果为"relativize source path "\opt\work" relativize path "\opt\temp" result path "..\temp"",可以看到返回了相对化路径,与其相反操作的方法
normalize方法,将移除相对化,示例代码如下:
Path normalizeSourcePath = Paths.get("/opt","work/../test");
System.out.println("normalize source path \"" + normalizeSourcePath + "\"
result path
\""
+ normalizeSourcePath.normalize() + "\"");
输出结果为"normalize source path "\opt\work\..\test" result path "\opt\test""。
- 文件
- 读写文件
Files类可以使得普通文件操作变得快捷,例如,使用
readAllBytes
方法可以很容易的读取文件的所有内容:byte{] bytes = Files.readAllBytes(path);
如果想将文件当作字符串读入,那么可以在调用
readAllBytes
方法后使用String类型实例化,如下代码:String content = new
String(bytes,charset);如果想把文件当作行序列读入,那么可以调用如下代码:
List<String> lines = Files.readAllLines(path);
如果希望写出字符串到文件,可以调用如下代码:
Files.write(path,content.getBytes(charset));
// 向文件追加内容
Files.write(path,content.getBytes(charset),StandardOpenOption.APPEND);
Files.write(path,lines);
以上方法适用于处理中等长度的文件,如果要处理的文件长度比较大,或者是二进制文件,那么应该使用熟知的流或者读入器/写出器,示例代码如下:
InputStream in = Files.newInputStream(path);
OutputStream out = Files.newOutputStream(path);
Reader in = Files.newBufferedReader(path);
Writer out = Files.newBufferedWriter(path);
- 复制、移动和删除文件
将文件从一个位置复制到另一个位置可以直接调用
Files.copy(fromPath,toPath);
移动文件可以调用
Files.move(fromPath,toPath);
如果目标路径已经存在,那么复制或移动将失败,如果想要覆盖已经有的目标路径,可以使用 REPLACE_EXISTING 选项,可以使用 COPY_ATTRIBUTES选项来复制所有的文件属性,示例代码如下:
Files.copy(fromPath,toPath,StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES);
可以将移动操作定义为原子性的,这样可以保证要么移动文件完成,要么文件保持在原地,可以使用StandardCopyOption.ATOMIC_MOVE,代码如下:
Files.move(fromPath,toPath,StandardCopyOption.ATOMIC_MOVE);
最后删除文件可以调用 delete 方法,如果文件不存在则会抛出异常,代码如下:
Files.delete(path);
如果不希望在文件不存在时抛出异常,则可以i使用
deleteIfExists 方法,该方法也可以用来删除空目录,代码如下:boolean deleted = Files.deleteIfExists(path);
- 创建文件和目录
创建新目录可以调用
createDirectory
方法,该方法的路径参数除最后一个部件外,其他部分都必须时已经存在的,如果要创建路径中间的目录,应该使用
createDirectories 方法,如果创建一个空文件可以使用 createFile 方法,如果文件已经存在,则会抛出异常,示例代码如下:Files.createDirectory(path);
Files.createDirectories(path);
Files.createFile(path);
有些便捷的方法可以用来在给定位置或者系统指定位置创建临时文件或者临时目录,代码如下:
Path tempDirFile = Files.createTempFile(dirPath, "tt", ".tmp");
Path systemTempFile = Files.createTempFile("sys", ".tmp");
System.out.println("Temp1=" + tempDirFile + "\tTemp2=" + systemTempFile);
Path tempDirPath = Files.createTempDirectory(dirPath, "dir");
Path systemTempDirPath = Files.createTempDirectory("sys");
System.out.println("Temp1=" + tempDirPath + "\tTemp2=" + systemTempDirPath);
- 获取文件信息
Files类提供了一些静态方法来获取文件信息和属性,方法如下:
- exists:检查路径文件或目录是否存在
- isHidden:检查路径文件或目录是否是隐藏的
- isReadable:检查路径文件或目录是否只读
- isWritable:检查路径文件是否可写
- isExecutable:检查路径文件是否可执行的
- isRegularFile:检查路径文件是否为常规文件
- isDirectory:检查路径是否为目录
- isSymbolicLink:检查路径是否为符号连接文件
- size:返回文件的字节数
- getOwner:返回文件的拥有者
所有的文件系统都会报告一个基本属性集,他们被封装在
BasicFileAttributes接口,基本文件属性包括:- 创建文件、最后一次访问以及最后一次修改文件的时间,这些时间都表示为
java.nio.file.attribute.FileTime 类 - 文件是常规文件、目录或者符号连接,或者三者都不是
- 文件尺寸
要获取这些属性,调用代码如下:
BasicFileAttributes basicAttributes = Files.readAttributes(filePath,BasicFileAttributes.class);
- 迭代目录中的文件
Files类设置了一个方法,他可以产生一个Iterable对象,通过整个对象可以遍历目录下的所有文件,示例代码如下:
dirPath = Paths.get("d:\\", "directories", "TempDir");
try (DirectoryStream<Path> entries = Files.newDirectoryStream(dirPath)) {
for (Path p : entries) {
BasicFileAttributes attributes = Files.readAttributes(p, BasicFileAttributes.class);
System.out.println("path=" + p + "\tisDirectory=" + attributes.isDirectory()
+ "\tsize=" + attributes.size());
}
}
try语句块用来确保目录流可以被正确关闭,访问目录中的项并没有具体的顺序,还可以使用glob模式来过滤文件,示例代码如下:
try (DirectoryStream<Path> entries = Files.newDirectoryStream(dirPath,"*.java")) {
// 处理代码
}
|
模式 |
描述 |
示例 |
|
* |
匹配路径组成部分中0个或多个字符 |
*.java 匹配当前目录中的所有 |
|
** |
匹配跨目录边界的0个或多个字符 |
**.java 匹配在所有子目录中的java文件 |
|
? |
匹配一个字符 |
???.java 匹配所有3个字符的java文件 |
|
[…] |
匹配一个字符集合,可以使用连线符[0-9]和取反符[!0-9] |
test[0-9].java 匹配testx.java,其中x表示数字0-9 |
|
{…} |
匹配由逗号隔开的多个可选项之一 |
*.{java,class}匹配所有的java文件和类class文件 |
|
\ |
转义上述任意模式中的字符 |
*\** 匹配所有文件名称包含 |
如果想要访问某个目录的所有子孙成员,可以转而调用
walkFileTree
方法,并向其传递一个
FileVisitor
类型的对象,该对象用来处理文件通知,说明如下:
在遇到一个文件或者目录时,会通知
visitFile 方法
在一个目录被处理前,会通知
preVisitDirectory
方法
在一个目录被处理后,会通知
postVisitDirectory方法
在试图访问文件或者目录出现错误,会通知
visitFileFailed
方法,并根据其返回结果来决定后续操作,返回结果有:
- FileVisitResult.CONTINUE:继续访问下一个文件
- FileVisitResult.SKIP_SUBTREE:继续访问,但是不再访问整个目录下的任何项
- FileVisitResult.SKIP_SIBLINGS:继续访问,但是不再访问整个文件的兄弟文件
- FileVisitResult.TERMINATE:终止访问
示例代码如下:
Files.walkFileTree(dirPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("preVisitDirectory path=" + dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
BasicFileAttributes attributes = Files.readAttributes(file, BasicFileAttributes.class);
System.out.println("visitFile path=" + file + "\tisDirectory=" + attributes.isDirectory()
+ "\tsize=" + attributes.size());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
System.out.println("visitFileFailed path=" + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("preVisitDirectory path=" + dir);
return FileVisitResult.CONTINUE;
}
});
- ZIP文件系统
Paths类会在默认文件系统中查找路径,即在用户本地磁盘中的文件,也可以在别的文件系统,例如ZIP文件系统,示例代码:
Path zipPath = Paths.get("C:\\Users\\Downloads", "commons-logging-1.2-bin.zip");
FileSystem fs = FileSystems.newFileSystem(zipPath, null);
将创建一个文件系统,包含ZIP文档中的所有文件,如果知道文件名称那么就可以从ZIP文文档中复制出整个文件,示例代码如下:
Files.copy(fs.getPath("commons-logging-1.2\\LICENSE.txt"),Paths.get("d:\\LICENSE.txt"));
其中,fs.getPath
对于任意文件系统来说,都和Paths.get
类似,如果要遍历ZIP文档中的所有文件,同样可以使用
walkFileTree
方法来处理,示例代码:Files.walkFileTree(fs.getPath("/"), new SimpleFileVisitor<Path>() {
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
System.out.println("Zip File " + file);
return FileVisitResult.CONTINUE;
}
});
笔记:I/O流-文件操作的更多相关文章
- 《Java核心技术卷二》笔记(二)文件操作和内存映射文件
文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...
- Nodejs学习笔记(4) 文件操作 fs 及 express 上传
目录 参考资料 1. fs 模块 1.1 读取文件fs.readFile 1.2 写入文件fs.writeFile 1.3 获取文件信息fs.stat 1.4 删除文件fs.unlink 1.5 读取 ...
- python学习笔记——(三)文件操作
·集合操作及其相应的操作符表示集合中没有插入,只有添加,因为毕竟无序 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Vergil Zhan ...
- python学习笔记(二)文件操作和集合
集合: 集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据 集合的作用: 1.它可以把一个列表中重复的数据去掉,而不需要你再写判断 2.可以做关系测试, ...
- python 基础学习笔记(5)--文件操作
**python 的文件操作** - [ ] 使用python来读写文件是非常简单的操作,我们使用open()来打开一个文件,获取到文件的语柄,然后通过文件语柄就可以进行各种各样的操作了. - [ ] ...
- 02-Node.js学习笔记-系统模块fs文件操作
2.1.什么是系统模块 Node 运行环境提供的API,因为这些API都是以模块化的方式进行开发的,所有我们又称Node运行环境提供的API为系统模块 3.1系统模块fs文件操作 //f :file ...
- python学习笔记(五)文件操作和集合
文件基本操作: 现有文件file.txt f=open('file.txt','r')#以只读方式打开一个文件,获取文件的句柄,如果是读的话,r可以不写,默认就是只读:文件不存在时,会报错 first ...
- python学习笔记(11)文件操作
一.读文件 读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直 ...
- python学习笔记(八)——文件操作
在 windows 系统下,我们通过 路径+文件名+扩展名的方式唯一标识一个文件,而在 Linux 系统下通过 路径+文件名唯一标识一个文件. 文件分类:文件主要可以分为文本文件和二进制文件,常见的如 ...
随机推荐
- Phoenix与Hive学习资料
1.Phoenix二级索引机制 http://www.tuicool.com/articles/FfMz6bq http://itindex.net/detail/50681-phoenix-sql- ...
- 转 Caffe学习系列(3):视觉层(Vision Layers)及参数
所有的层都具有的参数,如name, type, bottom, top和transform_param请参看我的前一篇文章:Caffe学习系列(2):数据层及参数 本文只讲解视觉层(Vision La ...
- 用Node.JS+MongoDB搭建个人博客(万众期待的router.js)(四)
万众期待的router.js,是我现在最想写的一个博客.因为他包含了整个个人博客的精髓.在这里,所有的请求配置,返回的参数等等所做的业务逻辑都在这个文件里实现. 我会详细说明这些代码的作用,所以这篇博 ...
- Linux Framebuffer驱动剖析之二—驱动框架、接口实现和使用
深入分析LinuxFramebuffer子系统的驱动框架.接口实现和使用. 一.LinuxFramebuffer的软件需求 上一篇文章详细阐述了LinuxFramebuffer的软件需求(请先理解第一 ...
- php 递归无线级别分类
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <?ph ...
- Excel 2010高级应用-气泡图(八)
Excel 2010高级应用-气泡图(八) 基本操作如下: 1.新建空白文档,并命名为气泡图,找到插入中的气泡图样 2.在其他图表中找到气泡图图样 3.单击气泡图图样,生成空白气泡图框 4.在气泡图图 ...
- Caused by: org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 81;
1.错误描述 严重: Exception sending context initialized event to listener instance of class org.springframe ...
- Caused by: java.lang.ClassNotFoundException: ognl.PropertyAccessor
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- Hibernate【映射】知识要点
前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的...因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址. 数据库表 我们一般如下图一样设 ...
- 原生js简单调用百度翻译API实现的翻译工具
先来个在线demo: js翻译工具 或者百度搜索js简单调用百度翻译API工具(不过有个小小的界面显示bug,我想细心的人应该会发现) 或者直接前往该网址:js翻译工具 或者前往我的github:gi ...