下面的代码片段是由经过验证的程序修改而来。观察这些代码片段你会发现,跟以前的版本相比,在Java7里,文件相关的操作变得简单的多了。通过使用新的Files
类里提供的各种方法,你可以只用一行代码就能完成下列的文件操作:
- 创建文件
- 删除文件
- 复制文件
- 文件移动/改名
这篇文件是以你对Java7里提供的新的Path
类很熟悉为前提,如果你不熟悉这个类,这里就简单说一句, Path
是文件系统里对位置的一个逻辑概念,例如 c:\ 和 ../foobar.txt 都是Path
。
创建和删除文件
下面的代码片段向你展示的是用 Files.createFile(Path target)
方法创建文件的基本用法。
Path target = Paths.get( "D:\\Backup\\MyStuff.txt" ); Path file = Files.createFile(target); |
很多时候,出于安全的原因,你可能希望在创建的文件上设置一下属性,例如:是否可读/可写/写执行。这些属性依赖于文件系统的种类,你需要使用跟文件系统相应的权限辅助类来完成这种操作。例如,PosixFilePermission
和PosixFilePermissions
为 POSIX 文件系统设计的。下面的是在POSIX文件系统上的文件设置读写权限的用法。
Path target = Paths.get( "D:\\Backup\\MyStuff.txt" ); Set<PosixFilePermission> perms = PosixFilePermissions.fromString( "rw-rw-rw-" ); FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms); Files.createFile(target, attr); |
这个 java.nio.file.attribute
包里提供了很多关于 FilePermission
的类。
警告 当创建一个带有权限属性的文件时,请注意包含这个文件的文件夹是否有权限的强制约束。例如,你会发现,由于这些限制,尽管你给创建的文件指定了 rw-rw-rw 权限,实际创建的结果却是 rw-r–r– 。
删除文件更简单,使用 Files.delete(Path)
这个方法。
Path target = Paths.get( "D:\\Backup\\MyStuff.txt" ); Files.delete(target); |
拷贝和移动文件
下面的代码向你展示的是使用 Files.copy(Path source, Path target)
方法做文件拷贝的基本用法。
Path source = Paths.get( "C:\\My Documents\\Stuff.txt" ); Path target = Paths.get( "D:\\Backup\\MyStuff.txt" ); Files.copy(source, target); |
经常的,在拷贝文件的过程中你可能希望指定一些操作设置。在Java7里,你可以通过使用 StandardCopyOption enum
来设置这些属性。下面看一个例子。
import static java.nio.file.StandardCopyOption.*; Path source = Paths.get( "C:\\My Documents\\Stuff.txt" ); Path target = Paths.get( "D:\\Backup\\MyStuff.txt" ); Files.copy(source, target, REPLACE_EXISTING); |
拷贝操作时可以使用的属性还包括COPY_ATTRIBUTES
(保留文件属性) 和 ATOMIC_MOVE
(确保移动事务操作的成功,否则进行回滚)。
移动文件的操作跟拷贝很相似,使用 Files.move(Path source, Path target)
方法。
同样,你也可以指定移动操作的属性,使用 Files.move(Path source, Path target, CopyOptions...)
方法里的参数来设置。
import static java.nio.file.StandardCopyOption.*; Path source = Paths.get( "C:\\My Documents\\Stuff.txt" ); Path target = Paths.get( "D:\\Backup\\MyStuff.txt" ); Files.move(source, target, REPLACE_EXISTING, COPY_ATTRIBUTES); |
可以看出,新的用于文件操作的 NIO.2 API 非常便于使用。
Java类库越来越庞大了。
我还是比较喜欢new File(string)
事实上,我是准备写一个自己的编译器,能够让Java对文件的操作像shell那样简单。
这里又加了一个Path类,实在不是明智之举,应该在File类上附加一些功能。
但还是很高兴的看到这些改进。
也没感觉方便多少 至少拿创建文件和删除文件来说 也没见到少了啥代码
感觉java与苹果类似,提供了一个本该有的功能(竞争产品早就有的),就算是创新、发明了