作者PsMonkey (痞子军团团长)
看板java
标题NIO.2 的档案操作
时间Sat Apr 5 23:35:24 2014
blog 版:
http://blog.dontcareabout.us/2014/04/nio2.html
BBS 版以 markdown 语法撰写
______________________________________________________________________
### 前言 ###
以往 Java 要操作档案时,总得自己去面对 XXStream、XXReader、XXWriter,
一不小心就迷失在 class hierarchy 迷宫中
而搞不清楚到底该怎麽写才好 [泪目]。
NIO.2 的出现,提供了简单好用的 method 来解决这些困扰。
这篇都还在 Java 7 的范围。
已经出的 Java 8 也对 NIO.2 做了一些改善,
中文资料可先参考 [Ingram Chen blog] 的 File operation 章节。
[Ingram Chen blog]:
http://ingramchen.io/blog/2014/04/
java-8-new-api-tips.html
### Path ###
在 NIO.2 中描述档案的方式,不再使用 `java.io.File`,
而改用 `java.nio.file.Path`。
跟 `File` 比起来,`Path` 的行为比较接近字串或 URI 的概念,
你没办法直接由 `Path` instance 去作一些操作(如 `File.mkdir()`)
或判断(如 `File.exists()`),必须透过 `Files`。
另外 `File` 与 `Path` 不同之处在於
`Path` 可以提供 symbolic link 的功能。
在 `Path` 与 `File` 之间转换,
可以透过 `Path.toFile()` 跟 `File.toPath()`。
注意:`File.getPath()` 跟 `Path` 没有关系。
### Files ###
单纯以使用的角度来看,NIO.2 的精华
在於 `java.nio.file.Files` 这个 utility class,
把很多行为都包的很简单扼要,简洁度跟在 command line 下指令差不多,
几乎直接条列出来就可以理解,不用多作解释
(谜之声:所以你是来混文章数的 [指]):
* 复制档案或目录:`Files.copy(sourcePath, targetPath, copyOptions)`
* copyOptions 参阅 `java.nio.file.StandardCopyOption`
* 删除档案或目录:`Files.delete(path)`
* 移动档案或目录:`Files.move(sourcePath, targetPath, copyOptions)`
* 取得档案大小:`Files.size(path)`,单位是 byte
* 读取档案:`Files.readAllBytes(path)` 会回传 `byte[]`,
或是用 `Files.readAllLines(path, charset)` 会回传 `List<String>`,
charset 参阅 `java.nio.charset.Charset`。
* 写入档案:`Files.write(path, bytes, openOptions)`
或是 `Files.write(path, lines, charset, openOptions)`。
openOptions 参阅 `java.nio.file.StandardOpenOption`。
搭配 `File.toPath()`,
既有使用 `File` 的程式码也几乎能马上转换成使用 `Files`。
### 其他有趣的功能 ###
* 用 glob 字串(例如 `*.{java,class,jar}`)
来指定过滤目录下档案的方式。
过去得在 `File.list()` 时传入 `FilenameFilter`,
现在则是用 `Files.newDirectorySteam(dirPath, globbingStr)`。
对於熟悉 glob 规则的人而言应该乐胜。
* 承上,用 glob 的方式找档案。
* 监控目录是否有改变。
* 判断档案的 MIME 型态。
完整的 NIO.2 教学可参见 [Java 官网][NIO.2]。
[NIO.2]:
http://docs.oracle.com/javase/tutorial/essential/io/fileio.html
====
在
#1JEuXhuu 下的推文看到 Killercat 提到 BufferedReader,
再加上今天看到 Ingram 的那篇 blog,
所以乾脆整理一篇文章来介绍(x)混文章数(o)
不过这玩意真的好用、又是 JDK 内建,不用可惜阿 XD
--
钱锺书:
说出来的话
http://www.psmonkey.org
比不上不说出来的话
Java 版 cookcomic 版
只影射着说不出来的话
and more......
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.37.95.152
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1396712127.A.A1C.html
1F:推 Killercat:这个算JDK8的亮点(虽然7就有) 不过8我最看好stream XD 04/05 23:47
2F:推 gmoz:感谢整理 04/06 19:51
3F:→ dream1124:推 04/09 00:41