Java经典I/O操作全解析
立即解锁
发布时间: 2025-08-19 00:13:25 阅读量: 9 订阅数: 47 


Java for Android开发:从Java SE到移动开发的迁移
# Java 经典 I/O 操作全解析
## 1. 引言
在应用程序开发中,数据的输入和输出是常见的操作。Java 提供了经典 I/O API(位于 `java.io` 包)和新 I/O(NIO)API(位于 `java.nio` 及相关子包)来支持 I/O 操作。本文将重点介绍经典 I/O API。
## 2. 使用 File API 访问文件系统
### 2.1 获取文件系统根目录
Java 通过 `java.io.File` 类提供对底层平台文件系统的访问。`File` 类的静态方法 `listRoots()` 可以返回可用文件系统的根目录数组。以下是一个示例代码:
```java
import java.io.File;
public class DumpRoots {
public static void main(String[] args) {
File[] roots = File.listRoots();
for (File root: roots)
System.out.println(root);
}
}
```
在 Windows 平台上运行该程序,可能会输出类似以下内容:
```plaintext
C:\
D:\
E:\
F:\
```
在 Unix 或 Linux 平台上运行,会输出虚拟文件系统的根目录 `/`。
### 2.2 构建 File 实例
除了使用 `listRoots()` 方法,还可以通过调用 `File` 类的构造函数来获取 `File` 实例。例如:
```java
File file1 = new File("/x/y");
File file2 = new File("C:\\temp\\x.dat");
```
第一个语句适用于 Unix/Linux 平台,路径名以根目录符号 `/` 开头;第二个语句适用于 Windows 平台,路径名以驱动器符号 `C:` 开头。
路径分为绝对路径和相对路径。绝对路径以根目录符号开头,无需其他信息即可定位文件或目录;相对路径不以根目录符号开头,需要结合其他路径信息来解释。Java 的 `java.io` 包中的类默认使用当前用户目录(由系统属性 `user.dir` 标识)来解析相对路径。
### 2.3 了解存储的抽象路径名
获取 `File` 对象后,可以调用其方法来了解存储的抽象路径名和其他属性。以下是一个示例代码:
```java
import java.io.File;
import java.io.IOException;
public class PathnameInfo {
public static void main(final String[] args) throws IOException {
if (args.length != 1) {
System.err.println("usage: java PathnameInfo pathname");
return;
}
File file = new File(args[0]);
System.out.println("Absolute path = " + file.getAbsolutePath());
System.out.println("Canonical path = " + file.getCanonicalPath());
System.out.println("Name = " + file.getName());
System.out.println("Parent = " + file.getParent());
System.out.println("Path = " + file.getPath());
System.out.println("Is absolute = " + file.isAbsolute());
}
}
```
当输入 `java PathnameInfo .` 时,可能会输出类似以下内容:
```plaintext
Absolute path = C:\prj\dev\ljfad3\ch11\code\PathnameInfo\.
Canonical path = C:\prj\dev\ljfad3\ch11\code\PathnameInfo
Name = .
Parent = null
Path = .
Is absolute = false
```
### 2.4 了解路径名对应的文件或目录
`File` 类的其他方法可以用于了解文件是否存在、是否为目录等信息。以下是一个示例代码:
```java
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class FileDirectoryInfo {
public static void main(final String[] args) throws IOException {
if (args.length != 1) {
System.err.println("usage: java FileDirectoryInfo pathname");
return;
}
File file = new File(args[0]);
System.out.println("About " + file + ":");
System.out.println("Exists = " + file.exists());
System.out.println("Is directory = " + file.isDirectory());
System.out.println("Is file = " + file.isFile());
System.out.println("Is hidden = " + file.isHidden());
System.out.println("Last modified = " + new Date(file.lastModified()));
System.out.println("Length = " + file.length());
}
}
```
假设存在一个名为 `x.dat` 的三字节文件,运行 `java FileDirectoryInfo x.dat` 可能会输出:
```plaintext
About x.dat:
Exists = true
Is directory = false
Is file = true
Is hidden = false
Last modified = Mon Oct 14 15:31:04 CDT 2019
Length = 3
```
### 2.5 获取磁盘空间信息
Java 6 为 `File` 类添加了 `getFreeSpace()`、`getTotalSpace()` 和 `getUsableSpace()` 方法,用于获取文件对象抽象路径名所描述的分区的空间信息。具体说明如下:
| 方法 | 描述 |
| --- | --- |
| `long getFreeSpace()` | 返回分区中未分配的字节数,若抽象路径名未指定分区则返回 0 |
| `long getTotalSpace()` | 返回分区的总大小(以字节为单位),若抽象路径名未指定分区则返回 0 |
| `long getUsableSpace()` | 返回当前虚拟机在分区中可用的字节数,若抽象路径名未指定分区则返回 0 |
`getUsableSpace()` 方法会检查写入权限和其他平台限制,因此比 `getFreeSpace()` 更准确。但需要注意的是,这两个方法返回的值只是一个提示,不保证 Java 应用程序可以使用所有或大部分未分配或可用的字节。
### 2.6 列出目录内容
`File` 类的 `list()` 和 `listFiles()` 方法可以返回指定目录下的文件和目录名称。以下是一个使用 `list(FilenameFilter)` 方法列出指定扩展名文件的示例代码:
```java
import java.io.File;
import java.io.FilenameFilter;
public class Dir {
public static void main(final String[] args) {
if (args.length != 2) {
System.err.println("usage: java Dir dirpath ext");
return;
}
File fi
```
0
0
复制全文
相关推荐









