Java文件和目录操作全解析
立即解锁
发布时间: 2025-08-18 01:55:06 阅读量: 1 订阅数: 5 

# Java文件和目录操作全解析
## 1. 理解File对象
在Java中,`File`对象并不直接代表一个物理文件或目录,而是封装了一个可能指向物理文件或目录的路径名。它有两个主要用途:一是检查其封装的路径名是否对应真实的文件或目录;二是用于创建文件流对象。
### 1.1 创建File对象
`File`类提供了四种构造函数来创建`File`对象:
1. **接受字符串参数**:最简单的构造函数接受一个`String`对象作为参数,指定文件或目录的路径。
```java
File myDir = new File("C:/jdk1.5.0/src/java/io");
```
在Windows系统中,也可以使用转义的反斜杠`\\`作为路径分隔符,但这样会使路径看起来更复杂,且需要更多的输入。
```java
File myDir = new File("C:\\jdk1.5.0\\src\\java\\io");
```
需要注意的是,构造函数不会检查传入的字符串是否为有效的路径。例如:
```java
File junk = new File("dwe\n:;?cc/.*\naa£%)("); // 不是有效的路径!
```
此语句可以编译和执行,但路径是无效的。因此,需要确保传入的字符串是系统有效的路径。
要指定文件的路径名,只需确保传递给构造函数的字符串确实指向一个文件而不是目录。
```java
File myFile = new File("C:/jdk1.5.0/src/java/io/File.java");
```
`File`对象的一个重要且容易被忽略的特性是它们是不可变的。一旦创建了`File`对象,就无法更改它封装的路径。可以使用`rename()`方法更改`File`对象引用的物理文件的名称,但这不会改变`File`对象本身。
2. **分别指定目录和文件名**:可以使用构造函数分别指定包含文件的目录和文件名。
```java
File myDir = new File("C:/jdk1.5.0/src/java/io"); // 父目录
File myFile = new File(myDir, "File.java"); // 文件的路径
```
也可以使用另一个构造函数达到相同的效果:
```java
File myFile = new File("C:/jdk1.5.0/src/java/io", "File.java");
```
使用`File`对象指定目录比直接使用字符串更有用,因为可以在访问感兴趣的文件之前验证目录是否真的存在,必要时还可以创建目录。
3. **从URI对象创建**:可以使用`URI`对象创建`File`对象。
```java
File remoteFile = new File(new URI("http://www.wrox.com/misc-pages/booklist.shtml"));
```
### 1.2 可移植路径考虑
`File`类包含一些静态成员,用于处理不同操作系统的路径分隔符:
- `separator`:类型为`String`,定义了操作系统中路径名之间的分隔符。在Unix系统中为`/`,在Windows系统中为`\\`。
- `separatorChar`:类型为`char`,定义了相同的分隔符字符,方便使用。
- `pathSeparator`:类型为`String`,定义了系统默认的用于分隔一个路径与另一个路径的字符。在Windows系统中为分号`;`,在Unix系统中为冒号`:`。
- `pathSeparatorChar`:类型为`char`,定义了相同的路径分隔符字符。
可以使用`separator`字段以更系统独立的方式指定路径:
```java
File myFile = new File("C:" + File.separator + "jdk1.5.0" + File.separator +
"src" + File.separator + "java" + File.separator +
"io", "File.java");
```
### 1.3 绝对路径和相对路径
路径名通常由两部分组成:一个可选的前缀和一系列由系统默认路径分隔符分隔的名称。包含前缀的路径是绝对路径,不包含前缀的路径是相对路径。相对路径只要由一个或多个由`File.separator`或`File.separatorChar`分隔的名称组成,就应该可以在不同系统之间移植。
例如,使用相对路径引用当前目录中的文件:
```java
File myFile = new File("output.txt");
```
也可以使用相对路径引用当前目录的子目录中的文件:
```java
File myFile = new File("dir" + File.separator + "output.txt");
```
在Windows环境中,绝对路径可以有一个明确的驱动器规范作为前缀,也可以使用UNC(通用命名约定)表示法来标识网络上共享资源的路径。在Unix系统中,根目录的路径为`/`。
### 1.4 访问系统属性
系统属性可以帮助指定独立于当前环境的路径。可以通过`System`类的静态`getProperty()`方法访问系统属性的值。例如,获取默认相对路径的基础目录:
```java
String currentDir = System.getProperty("user.dir");
File dataFile = new File(currentDir, "output.txt");
```
另一个系统属性`user.home`定义了用户主目录的路径。可以使用它指定文件的位置:
```java
File dataFile = new File(System.getProperty("user.home"), "output.txt");
```
可以使用以下程序列出当前系统属性的键和值:
```java
public class TryProperties {
public static void main(String[] args) {
java.util.Properties properties = System.getProperties();
properties.list(System.out);
}
}
```
还可以使用`System`类的静态`setProperty()`方法更改系统属性的值,使用`clearProperty()`方法移除系统属性的当前值。
```java
System.setProperty("user.dir", "C:/MyProg");
String oldValue = System.clearProperty("java.class.path");
```
### 1.5 测试和检查File对象
`File`类提供了30多个方法用于操作`File`对象,以下是一些常用的方法:
| 方法 | 描述 |
| --- | --- |
| `getName()` | 返回一个包含文件名(不包含路径)的`String`对象,即对象中存储的路径的最后一个名称。对于表示目录的`File`对象,只返回目录名。 |
| `getPath()` | 返回一个包含`File`对象路径的`String`对象,包括文件名或目录名。 |
| `isAbsolute()` | 如果`File`对象引用的是绝对路径名,则返回`true`,否则返回`false`。 |
| `getParent()` | 返回一个包含当前`File`对象所代表的文件或目录的父目录名称的`String`对象。如果没有指定父目录,则返回`null`。 |
| `getParentFile()` | 返回父目录作为一个`File`对象,如果该`File`对象没有父目录,则返回`null`。 |
| `toString()` | 返回当前`File`对象的`String`表示形式,当`File`对象与`String`对象连接时会自动调用。返回的字符串与`getPath()`方法返回的字符串相同。 |
| `hashCode()` | 返回当前`File`对象的哈希码值。 |
| `equals()` | 用于比较两个`File`对象是否相等。如果作为参数传递的`File`对象与当前对象具有相同的路径,则返回`true`,否则返回`false`。 |
### 1.6 查询文件和目录
可以使用以下方法检查`File`对象引用的文件或目录:
| 方法 | 描述 |
| --- | --- |
| `exists()` | 如果`File`对象引用的文件或目录存在,则返回`true`,否则返回`false`。 |
| `isDirectory()` | 如果`File`对象引用的是现有目录,则返回`true`,否则返回`false`。 |
| `isFile()` | 如果`File`对象引用的是现有文件,则返回`true`,否则返回`false`。 |
| `isHidden()` | 如果`File`对象引用的文件是隐藏的,则返回`true`,否则返回`false`。文件的隐藏方式因系统而异。 |
| `canRead()` | 如果允许读取`File`对象引用的文件,则返回`true`,否则返回`false`。如果不允许读取文件,此方法可能会抛出`SecurityException`异常。 |
| `canWrite()` | 如果允许写入`File`对象引用的文件,则返回`true`,否则返回`false`。如果不允许写入文件,此方法可能会抛出`SecurityException`异常。 |
| `getAbsolutePath()` | 返回当前`File`对象引用的目录或文件的绝对路径。如果对象包含绝对路径,则返回`getPath()`方法返回的字符串。否则,在Windows系统中,路径将根据路径名中标识的驱动器的当前目录解析,或者如果路径名中没有出现驱动器字母,则根据当前用户目录解析;在Unix系统中,根据当前用户目录解析。 |
| `getAbsoluteFile()` | 返回一个包含当前`File`对象引用的目录或文件的绝对路径的`File`对象。 |
以下是一个测试文件的示例代码:
```java
import java.io.File;
public class TryFile {
public static void main(String[] args) {
// 创建一个表示目录的对象
File myDir = new File("C:/jdk1.5.0/src/java/io");
System.out.println(myDir + (myDir.isDirectory() ? " is" : " is not")
+ " a directory.");
// 创建一个表示文件的对象
File myFile = new File(myDir, "File.java");
System.out.println(myFile + (myFile.exists() ? " does" : " does not")
+ " exist");
System.out.println(myFile + (myFile.isFile() ? " is" : " is not")
+ " a file.");
System.out.println(myFile + (myFile.isHidden() ? " is" : " is not")
+ " hidden");
System.out.println("You can" + (myFile.canRead() ? " " : "not ")
+ "read " + myFile);
System.out.println("You can" + (myFile.canWrite() ? " " : "not ")
+ "write " + myFile);
return;
}
}
```
还可以使用以下方法获取文件或目录的更多信息:
| 方法 | 描述 |
| --- | --- |
| `list()` | 如果当前`File`对象表示一个目录,则返回一个包含该目录成员名称的`String`数组。如果目录为空,数组将为空。如果当前`File`对象是一个文件,则返回`null`。如果访问目录未被授权,该方法将抛出`SecurityException`异常。 |
| `listFiles()` | 如果调用此方法的对象是一个目录,则返回一个对应于该目录中文件和目录的`File`对象数组。如果目录为空,则返回的数组将为空。如果对象不是目录或发生I/O错误,该方法将返回`null`。如果访问目录未被授权,该方法将抛出`SecurityException`异常。 |
| `length()` | 返回当前`File`对象表示的文件的长度(以字节为单位)。如果当前对象的路径名引用的文件不存在,则该方法将返回零。如果路径名引用的是目录,则返回的值未定义。 |
| `lastModified()` | 返回当前`File`对象表示的目录或文件最后修改的时间。这个时间是自1970年1月1日午夜(GMT)以来的毫秒数。如果文件不存在,则返回零。 |
`File`类的静态方法`listRoots()`返回一个`File`对象数组,每个元素对应于当前文件系统中的一个根目录。
```java
File[] roots = File.listRoots();
for (File root : roots) {
System.out.println(root);
}
```
### 1.7 过滤文件列表
`File`类的`list()`和`listFiles()`方法有重载版本,接受一个参数用于过滤文件列表。可以使用`FilenameFilter`或`FileFilter`接口来实现过滤。
`FilenameFilter`接口定义如下:
```java
public interface FilenameFilter {
public abstract boolean accept(File directory, String filename);
}
```
`FileFilter`接口定义如下:
```java
public interface FileFilter {
public abstract boolean accept(File pathname);
}
```
以下是一个使用`FilenameFilter`接口过滤文件列表的示例:
```java
import java.io.File;
import java.io.FilenameFilter;
public class FileListFilter implements FilenameFilter {
private String name; // 文件名过滤器
private String extension; // 文件扩展名过滤器
// 构造函数
public FileListFilter(String name, String extension) {
this.name = name;
this.extension = extension;
}
public boolean accept(File directory, String filename) {
bo
```
0
0
复制全文