Path 类是jdk7新增加的特性之一,用来代替java.io.File类。
之所以新增这个类,是由于java.io.File类有很多缺陷:
1.java.io.File类里面很多方法失败时没有异常处理,或抛出异常,例如:
public boolean delete() { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkDelete(path); } return fs.delete(this); }
java.io.File.delete()方法返回一个布尔值指示成功或失败但是没有失败原因。而java.nio.file.Files.delete(Path):
public static void delete(Path path) throws IOException { provider(path).delete(path); }
这个方法会抛出:NoSuchFileException,DirectoryNotEmptyException,IOException,SecurityException这样当删除一个文件失败时可以根据异常来查找失败原因。
例如:
package io.path; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class DeleteFile { public static void main(String[] args) throws IOException { Path path = Paths.get("H://afile");//This path does not exsit in file system. Files.delete(path); } }
运行结果:
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:268)
at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
at java.nio.file.Files.delete(Files.java:1077)
at io.path.DeleteFile.main(DeleteFile.java:12)
2.java.io.File.rename(File file)方法在不同平台中运行时可能会有问题,这个方法不能将一个文件从一个文件系统移到另一个文件系统,这个方法的操作也不是原子性的,如果参数指定的文件名已经存在这个方法也可能执行失败:
package io.path; import java.io.File; import java.io.IOException; import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; public class FileRename { /** * Expected Result: rename beforeRename1.txt to rename1.txt; beforeRename1.txt disappears; and the content of * rename1.txt is the same with beforeRename1.txt */ public static void rename1() { File file = new File("D:\\360云盘\\javase\\src\\io\\beforeRename1.txt");// The content of beforeRename1.txt is a // string // with value "1111" File destinationfile1 = new File("D:\\360云盘\\javase\\src\\io\\rename1.txt");// rename1.txt has already // existed. and the content is null. file.renameTo(destinationfile1); } /** * Expected Result: rename beforeRename2.txt to rename2.txt ;beforeRename2.txt disappears; and the content of * rename2.txt is the same with beforeRename2.txt,that is "2222" */ public static void rename2() { File file = new File("D:\\360云盘\\javase\\src\\io\\beforeRename2.txt");// The content of beforeRename2.txt is a // string // with value "2222" File destinationfile2 = new File("D:\\360云盘\\javase\\src\\io\\rename2.txt");// rename2.txt does not exist. file.renameTo(destinationfile2); } /** * Expected Result: rename beforeRename3.txt to rename3.txt ;beforeRename3.txt disappears; and the content of * rename3.txt is the same with beforeRename3.txt ,that is "3333" */ public static void rename3() throws IOException { Path path = Paths.get("D:\\360云盘\\javase\\src\\io\\beforeRename3.txt");// The content of beforeRename3.txt is a // string with value of "3333" Path pathRename = Paths.get("D:\\360云盘\\javase\\src\\io\\rename3.txt");// rename3.txt has already existed,and // the content is null. Files.move(path, pathRename, StandardCopyOption.REPLACE_EXISTING); } public static void main(String[] args) throws IOException { // rename1(); // rename2(); rename3(); } }
上面这个类中,执行之后会发现,beforeRename1.txt依然还在,rename1.txt的文件内容也米有改变,而beforeRename2.txt文件已经被重命名为rename2.txt,而且rename2.txt的内容与beforeRename2.txt的内容一样 为“2222”。但是如果使用java.nio.Files.move(Path source, Path target, CopyOption... options)可以发现即使 rename3已经存在,也可以把beforeRename3.txt成功的重命名为rename3.txt
3. 读取文件属性相关
File类中读取文件属性都是一个方法返回一个属性值,而没有能够直接一次返回很多属性的方法,造成访问文件属性时效率的问题。
但是对于jkd7新增的api中可以批量读取文件属性,而且可以访问到文件更详细的属性。
package io.path; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; import java.util.Map; public class FileAttribute { public static void main(String[] args) throws IOException { // ==============Get attribute by File========================= File file = new File("D:\\360云盘\\javase\\src\\io\\path.txt"); System.out.println("isDirectory:" + file.isDirectory()); System.out.println("isHidden:" + file.isHidden()); System.out.println("canRead:" + file.canRead()); System.out.println("canWrite:" + file.canWrite()); System.out.println("lastModified:" + file.lastModified()); System.out.println("length:" + file.length()); // ==============Get attribute by Path========================= Path path = Paths.get("D:\\360云盘\\javase\\src\\io\\path.txt"); readAttributes(path, "*", LinkOption.NOFOLLOW_LINKS); System.out.println(Files.getOwner(path, LinkOption.NOFOLLOW_LINKS).getName()); BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS); System.out.println(attributes.fileKey()); System.out.println(attributes.isOther()); } /** * * @param path * @param attributes * @param linkOption * @throws IOException */ public static void readAttributes(Path path, String attributes, LinkOption... linkOption) throws IOException { Map<String, Object> map = Files.readAttributes(path, attributes, linkOption); for (String s : map.keySet()) { System.out.println(s + ":" + map.get(s)); } } }
除了以上还有其它一些问题,例如file.list();方法在处理比较大的目录时效率很低,但是为什么效率低?而java.nio.file是怎样优化的呢?没搞清楚.........
相关推荐
在探讨Java.nio与Java.io之间的比较时,我们首先需要理解这两个包在Java编程语言中的核心作用和它们各自的优势。Java.io和Java.nio是Java中处理输入/输出操作的两个主要框架,它们各自拥有独特的特性和应用场景。 #...
java.io clojure.java.io 的 JK7 java.nio.file.Path 兼容性依赖信息该库托管在 Releases 上。 依赖: [me.moocar/java.io " 0.1.0 " ]用法是 JDK7 中引入的文件路径的抽象。 这个库提供了和 Paths 之间的兼容性。 ...
### Java NIO API 与旧版 I/O API 的关系 值得注意的是,Java NIO API 是对旧版 I/O API 的补充而非替代。这意味着开发者需要了解何时使用新 API,何时使用旧版 API。本书也会对此进行详细解释,帮助开发者根据特定...
NIO.2,又称为New I/O 2或Java NIO 2,是在Java 7中引入的进一步扩展,主要增加了文件系统操作的支持,包括异步I/O操作、文件通道、文件锁定以及对符号链接的支持。AsynchronousFileChannel是NIO.2中新增的异步I/O...
4. **文件API增强**:引入了`java.nio.file`包,提供了更强大、更易用的文件操作接口,支持Path、Files和Paths类等。 5. **try-with-resources**:一种新的资源管理方式,自动关闭在try语句块中打开的资源,如输入/...
java学习笔记1(java io/nio)设计模式
5. **NIO.2**:增加了对异步I/O的支持,如Path API和文件系统感知。 6. **G1垃圾收集器**:提供了一种新的垃圾回收策略,旨在减少停顿时间。 在解压并安装"java-7-openjdk-amd64.tar.gz"时,用户需要确保系统已安装...
3. NIO.2:Java 7引入了NIO.2,但1.6版本已经包含了一些改进,如更好的文件系统访问API,异步I/O操作等。 4. 并发工具:提供了一些新的并发工具类,如`java.util.concurrent`包下的`CountDownLatch`、`CyclicBarrier...
Java.nio,全称为Java Non-blocking Input/Output,是Java平台从1.4版本开始引入的一套全新的I/O API,旨在替代传统的Java.io流API。它提供了更高效、更灵活的I/O操作方式,特别是在处理大量并发连接时,性能显著...
6. **文件系统API**:Java 7引入了新的文件系统API(java.nio.file包),提供了更强大的文件操作功能,如路径操作、遍历目录树和文件属性查询等。 7. **Fork/Join框架**:这个并行计算框架允许开发者将大任务分解为...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...
Java 早期版本的文件I/O操作功能相对有限,存在几个显著问题:不支持现代文件系统特性、API设计复杂且冗长、处理大文件和并发性能不足。为了解决这些问题,Java引入了`java.nio.file`库,这个库极大地提升了Java在...
Java IO 是Java编程语言中处理输入/输出流的重要部分,它是连接程序与外部世界的桥梁,允许数据在程序和外部资源之间流动。`commons-io-2.5.jar` 是Apache Commons项目的一部分,它提供了一系列增强和扩展了Java标准...
**Java Development Kit (JDK) 7 Update 7 for Linux i586** JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的软件工具包。它包含了Java编译器、Java运行环境(JRE)、调试器、性能分析...
5. **NIO.2文件系统API**:引入了`java.nio.file`包,提供了一套新的文件系统操作API,支持文件路径操作、文件属性查询和变更、文件观察等,相比传统的I/O操作更加强大和高效。 6. **字符串拼接优化**:JDK 7对字符...
5. **文件系统API(NIO.2)**:引入了新的java.nio.file包,提供了更强大的文件操作功能,包括路径操作、文件属性查询以及异步I/O等。 6. **钻石运算符**:在创建匿名对象时,编译器可以自动推断出构造函数的参数...
在Java编程领域,JDK 7引入了一个重要的更新——NIO2.0,也被称为“New I/O 2.0”或“AIO”(Asynchronous I/O)。这个更新极大地提升了Java处理I/O操作的能力,特别是在文件系统交互和网络通信方面。NIO2.0主要增加...
Java NIO(New Input/Output)是Java在JDK 1.4中引入的新I/O机制,旨在提高I/O操作的性能。NIO基于缓冲区(Buffers)、通道(Channels)、选择器(Selectors)等概念。 缓冲区是NIO中一个核心概念,它是一个对象,...
Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...