Java7中对文件管理提供了大量的新API,这些新的接口可以使我们操纵文件以及文件夹更加方便。它们大多位于java.nio.file包下。
- java.nio.file.Paths 包含了用于创建Path对象的静态方法
- java.nio.file.Path 包含了大量用于操纵文件路径的方法
- java.nio.file.FileSystems 用于访问文件系统的类
- java.nio.file.FileSystem 代表了一种文件系统,例如Unix下的根目录为 / ,而Windows下则为C盘
- java.nio.file.FileStore 代表了真正的存储设备,提供了设备的详尽信息
- java.nio.file.attribute.FileStoreAttributeView 提供了访问文件的信息
一个路径可以确定一个文件或者文件夹的具体位置。Java7中用Path对象来实现对文件或者文件夹的操作。获得一个Path对象的方法有很多,主要有以下两种:
- 使用FileSystem对象的getPath方法
- 使用Path对象的get方法
我们先来看看getPath方法,示例代码如下。
public static void main(String[] args) {
Path path = FileSystems.getDefault().getPath("/Home/projects/node.txt");
System.out.println();
System.out.println("toString: " + path.toString());
System.out.printf("getFileName: %s\n", path.getFileName());
System.out.printf("getRoot: %s\n", path.getRoot());
System.out.printf("getNameCount: %d\n", path.getNameCount());
for (int index = 0; index < path.getNameCount(); index++) {
System.out.printf("getName(%d): %s\n", index, path.getName(index));
}
System.out.printf("subpath(0,2): %s\n", path.subpath(0, 2));
System.out.printf("getParent: %s\n", path.getParent());
System.out.println(path.isAbsolute());
try {
path = Paths.get("Home", "projects", "users.txt");
System.out.printf("Absolute path: %s", path.toAbsolutePath());
} catch (InvalidPathException ex) {
System.out.printf("Bad path: [%s] at position %s", ex.getInput(), ex.getIndex());
}
}
示例中FileSystems的getDefault方法,会由JVM返回一个代表了当前文件系统的FileSystem对象,我们可以通过FileSystem来获得Path对象。一个Path可以由多个子Path组成,子Path可以可通用过subpath方法来获得。
使用Paths类的get方法同样可以获得一个Path对象,如果你查看JDK的源码你会发现,它的实现方式和用FileSystem是一样的。
public static Path get(String first, String... more) {
return FileSystems.getDefault().getPath(first, more);
}
如果我们使用的系统中有大量Java7之前对文件操作的代码,例如使用了很多File类的话,我们可以通过Java7中对File类新增的toPath方法来将一个File转换成Path。
public static void main(String[] args) {
try {
Path path = Paths.get(new URI("file:///C:/home/docs/users.txt"));
File file = new File("C:\\home\\docs\\users.txt");
Path toPath = file.toPath();
System.out.println(toPath.equals(path));
} catch (URISyntaxException e) {
System.out.println("Bad URI");
}
}
将一个相对路径转换成绝对路径,只需要调用Path类的toAbsolutePath方法。此外如果想要获得系统的路径分隔符,FileSystem也提供了getSeparator方法。
public static void main(String[] args) {
String separator = FileSystems.getDefault().getSeparator();
System.out.println("The separator is " + separator);
try {
Path path = Paths.get(new URI("file:///D:/Home/projects/node.txt"));
System.out.println("subpath: " + path.subpath(0, 3));
path = Paths.get("/home", "docs", "users.txt");
System.out.println("Absolute path: " + path.toAbsolutePath());
System.out.println("URI: " + path.toUri());
} catch (URISyntaxException ex) {
System.out.println("Bad URI");
} catch (InvalidPathException ex) {
System.out.println("Bad path: [" + ex.getInput() + "] at position " + ex.getIndex());
}
}
判断一个文件是否真实存在,在Files类中提供了exists方法,它接收一个Path对象作为参数。
Path path = Paths.get(new URI("file:///C:/home/docs/bogusfile.txt"));
System.out.println("File exists: " + Files.exists(path));
当路径描述符中有"."或者".."字符时,我们可以通过调用Path的normalize方法将这些描述符转换成真正的路径。运行下面的代码,你会发现"."都被删除掉了,因为它代表当前路径。".."会用上一层路径代替。
public static void main(String[] args) {
Path path = Paths.get("D:/home/docs/../music/Space Machine A.mp3");
System.out.println("Absolute path: " + path.toAbsolutePath());
System.out.println("URI: " + path.toUri());
System.out.println("Normalized Path: " + path.normalize());
System.out.println("Normalized URI: " + path.normalize().toUri());
System.out.println();
path = Paths.get("D:/home/./music/ Robot Brain A.mp3");
System.out.println("Absolute path: " + path.toAbsolutePath());
System.out.println("URI: " + path.toUri());
System.out.println("Normalized Path: " + path.normalize());
System.out.println("Normalized URI: " + path.normalize().toUri());
}
Path的toRealPath会返回一个真实代表一个文件的路径,如果所指定的文件不存在,NoSuchFileException异常会被抛出。toRealPath可以传入一个LinkOption.NOFOLLOW_LINKS参数来将结果以链接的路径显示。Files判断文件是否存在的方法也可以加入此参数。下面的例子中music文件夹下的users是docs文件下users文件的链接。
public static void main(String[] args) {
Path path1 = null;
Path path2 = null;
path1 = Paths.get("/home/docs/users.txt");
path2 = Paths.get("/home/music/users.txt");
System.out.println(Files.isSymbolicLink(path1));
System.out.println(Files.isSymbolicLink(path2));
try {
Path path = Paths.get("C:/home/./music/users.txt");
System.out.println("Normalized: " + path.normalize());
System.out.println("Absolute path: " + path.toAbsolutePath());
System.out.println("URI: " + path.toUri());
System.out.println("toRealPath (Do not follow links): " + path.toRealPath(LinkOption.NOFOLLOW_LINKS));
System.out.println("toRealPath: " + path.toRealPath());
Path firstPath = Paths.get("/home/music/users.txt");
Path secondPath = Paths.get("/docs/status.txt");
System.out.println("From firstPath to secondPath: " + firstPath.relativize(secondPath));
System.out.println("From secondPath to firstPath: " + secondPath.relativize(firstPath));
System.out.println("exists (Do not follow links): " + Files.exists(firstPath, LinkOption.NOFOLLOW_LINKS));
System.out.println("exists: " + Files.exists(firstPath));
System.out.println("notExists (Do not follow links): " + Files.notExists(firstPath, LinkOption.NOFOLLOW_LINKS));
System.out.println("notExists: " + Files.notExists(firstPath));
} catch (IOException ex) {
Logger.getLogger(SymbolicLinkExample.class.getName()).log(Level.SEVERE, null, ex);
}
}
Java7中新引用的这些类的确大大简化了我们进行文件操作,使得操作文件不再那么繁琐。今后我们还会对如何修改,复制以及删除文件进行进一步了解。
分享到:
相关推荐
- 在Windows系统中,可以修改系统的区域和语言设置,确保文件路径的默认编码与Java期望的编码一致。 6. 第三方库支持: - 使用第三方库,如Apache Commons IO或Google的Guava,它们提供了一些工具类来帮助处理...
安装完成后,用户需要将新安装的JDK添加到系统路径中,以便能够正确执行Java命令。 总之,"java-7-openjdk-amd64.tar.gz"是一个适用于Linux x86_64平台的OpenJDK 7源代码包,主要用于那些需要Java 7环境的开发者或...
1. **Strings in Switch语句**:在Java 7中,字符串可以被用作switch语句的条件,使得处理枚举类型或字符串常量的代码更加简洁。 2. **多路返回值**:使用`钻石操作符(Diamond Operator)`,在创建泛型实例时可以...
Java读取GRIB2文件是气象和气候数据处理中常见的任务,因为GRIB(General Regularly-distributed Information in Binary form)格式是世界气象组织(WMO)推荐的标准数据存储格式,广泛用于气象预报和气候模型输出。...
7. **验证安装**:通过在命令行中输入`java -version`和`javac -version`来检查Java运行时和编译器是否已正确安装。 `使用说明.txt`文件可能包含了安装过程中的一些详细指南,例如如何配置环境变量,或者可能提供...
在实际开发中,你可以将`mysql-connector-java-5.1.10.jar`添加到项目的类路径(classpath)中,或者在Maven或Gradle等构建工具的依赖管理中指定对应的版本,以确保Java应用能够找到并使用这个驱动。 总结,`mysql-...
2. **protobuf-java-3.2.0.jar**:这个文件是protobuf的Java版本运行库,包含了处理protobuf序列化和反序列化的类库。开发者在Java项目中引入这个jar包,就可以在Java程序中使用protobuf API来编码和解码protobuf...
在Java 7中,文件操作得到了显著的改进,引入了`java.nio.file`包,其中最重要的新特性之一就是Path类的出现。Path类是Java 7文件系统接口(FileSystem API)的核心部分,它提供了一种抽象的方式来表示文件或目录的...
1. **下载与引入**:从MySQL官方网站或其他可靠源下载该jar文件,然后将其添加到Java项目的类路径中,可以通过Maven或Gradle等构建工具管理依赖。 2. **建立连接**:使用`DriverManager.getConnection()`方法,传入...
在Java 7中,JRE(Java Runtime Environment)是运行Java应用程序所必需的组件,包括Java虚拟机(JVM)、类库和其他支持文件。绿色版JRE旨在提供一种便携式解决方案,用户无需进行系统级别的安装即可使用Java环境。...
- 文件路径可能需要根据运行环境进行调整。例如,开发阶段文件可能在`src/main/resources`,但在生产环境中,它们可能被复制到了`WEB-INF/classes`或类似的位置。使用`getResource()`或`getResourceAsStream()`方法...
4. **设置环境变量**:为了使系统能识别并使用新安装的OpenJDK,你需要更新 `JAVA_HOME` 环境变量,并在系统路径中添加Java可执行文件的路径。在终端中编辑 `~/.bashrc` 或 `~/.bash_profile` 文件(取决于你的Shell...
在使用这个jar文件时,开发者通常需要将其添加到项目的类路径中,以便运行时能够找到并加载MySQL的JDBC驱动。这可以通过IDE的配置、构建脚本(如Ant或Maven)或者直接在Java应用的启动命令行中指定。 总结来说,...
文本文件【7月3日.txt】至【7月25日.txt】可能是每日学习要点或作业的记录,随着时间推移,内容可能涉及更多高级主题,如集合框架(ArrayList、LinkedList、HashMap等)、IO流、线程并发、网络编程、数据库连接以及...
为了在Java项目中使用这个驱动,开发人员通常会将mysql-connector-java-8.0.29.jar文件添加到项目的类路径中,或者通过Maven或Gradle等构建工具进行依赖管理。在完成这些步骤后,就可以编写SQL查询,执行CRUD操作,...
通常,这涉及到修改php.ini文件,设置适当的Java桥接器路径,并可能需要配置web.xml文件以启用php-servlet。 5. **应用场景**: PHP/Java Bridge常用于需要跨语言集成的场景,比如在PHP网站中利用Java的复杂计算...
8. **改进的Swing和JavaFX**:Swing组件和JavaFX在Java 7中得到升级,提高了用户体验和性能。 9. **元空间(MetaSpace)**:替代了以前的PermGen空间,用于存储类元数据,减少了因 PermGen 满导致的...
例如,5.0.8版本可能不支持较新的MySQL特性,因此在新项目中,可能需要选择更现代的版本以利用最新特性并确保兼容性。 总之,`mysql-connector-java-5.0.8-bin.zip`是Java开发者与MySQL数据库交互的核心工具,它...
1. 将JAR文件添加到Java项目的类路径中,可以是构建工具(如Maven或Gradle)的依赖,也可以是IDE的类路径设置。 2. 使用`Class.forName("com.mysql.jdbc.Driver")`加载驱动。 3. 使用`DriverManager.getConnection()...
3. **文件系统API增强**:NIO.2(New IO 2.0)提供了一组新的文件系统API,支持文件路径操作、文件属性查询、文件观察服务等功能,使得文件操作更加便捷。 4. ** try-with-resources**:此特性允许开发者在try语句...