在 Java 编程中,IO(输入输出)操作是处理文件和数据流的核心部分。本文将围绕文件系统、硬盘存储、Java 的 File
类以及 InputStream
和 OutputStream
的使用进行详细总结,帮助读者全面掌握 Java IO 编程的核心知识。
一、IO、存储与文件系统基础
1. 存储设备与硬盘
-
硬盘:计算机的主要存储设备,分为机械硬盘(HDD)和固态硬盘(SSD)。
-
存储单位:字节(Byte)、千字节(KB)、兆字节(MB)、g字节(GB)等。
-
读写速度:SSD 的读写速度远高于 HDD,但价格更贵。
2. 文件系统
-
文件系统:操作系统用于管理文件和目录的机制,常见的有 NTFS(Windows)、EXT4(Linux)、APFS(macOS)。
-
文件与目录:文件是数据的集合,目录是文件的容器。
-
路径:文件或目录在文件系统中的位置,分为绝对路径和相对路径。
二、Java 中的 File
类
File
类是 Java 中用于表示文件和目录路径名的抽象表示。它可以用于创建、删除、重命名文件和目录,以及查询文件属性。
1. 创建 File
对象
java
复制
File file = new File("example.txt"); // 相对路径
File dir = new File("/path/to/directory"); // 绝对路径
2. 常用方法
方法 | 作用 |
---|---|
exists() |
判断文件或目录是否存在。 |
isFile() |
判断是否为文件。 |
isDirectory() |
判断是否为目录。 |
createNewFile() |
创建新文件。 |
mkdir() |
创建单级目录。 |
mkdirs() |
创建多级目录。 |
delete() |
删除文件或空目录。 |
listFiles() |
返回目录下的文件和子目录。 |
getPath() |
获取文件或目录的路径。 |
getAbsolutePath() |
获取文件或目录的绝对路径。 |
getName() |
获取文件或目录的名称。 |
length() |
获取文件大小(字节数)。 |
示例:遍历目录
java
复制
File dir = new File("/path/to/directory");
if (dir.isDirectory()) {
for (File file : dir.listFiles()) {
System.out.println(file.getName());
}
}
三、Java 中的流操作
Java 的 IO 流分为字节流和字符流,本文重点介绍字节流(InputStream
和 OutputStream
)。
1. InputStream
(字节输入流)
InputStream
是所有字节输入流的基类,用于从数据源(如文件、网络)读取字节数据。
常用方法
方法 | 作用 |
---|---|
read() |
读取一个字节,返回 -1 表示结束。 |
read(byte[] b) |
读取字节到数组,返回实际读取的字节数。 |
close() |
关闭流,释放资源。 |
示例:读取文件内容
java
复制
try (InputStream in = new FileInputStream("example.txt")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
System.out.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
2. OutputStream
(字节输出流)
OutputStream
是所有字节输出流的基类,用于将字节数据写入目标(如文件、网络)。
常用方法
方法 | 作用 |
---|---|
write(int b) |
写入一个字节。 |
write(byte[] b) |
写入字节数组。 |
flush() |
刷新缓冲区,强制写入数据。 |
close() |
关闭流,释放资源。 |
示例:写入文件内容
java
复制
try (OutputStream out = new FileOutputStream("example.txt")) {
String data = "Hello, World!";
out.write(data.getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
3. 缓冲流(BufferedInputStream/BufferedOutputStream)
为了提高 IO 性能,Java 提供了缓冲流,通过在内存中缓存数据,减少对底层设备的直接操作。
示例:使用缓冲流
java
复制
try (InputStream in = new BufferedInputStream(new FileInputStream("example.txt"));
OutputStream out = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
四、常见问题与面试题
1. File
类能直接操作文件内容吗?
- 答案 :不能。
File
类只能操作文件元数据(如路径、大小、权限等),文件内容需要通过流操作。
2. 字节流与字符流的区别?
-
字节流:以字节为单位操作数据,适用于二进制文件(如图片、视频)。
-
字符流 :以字符为单位操作数据,适用于文本文件(如
.txt
、.csv
)。
3. 如何高效地复制大文件?
- 答案 :使用缓冲流(如
BufferedInputStream
和BufferedOutputStream
),减少 IO 操作次数。
4. try-with-resources
的作用是什么?
- 答案 :自动关闭资源(如流),避免资源泄漏。适用于实现了
AutoCloseable
接口的类。
五、总结
Java 的 IO 操作是处理文件和数据的核心工具,主要包括以下内容:
-
File
类:用于操作文件和目录的元数据。 -
字节流 :
InputStream
和OutputStream
用于读写字节数据。 -
缓冲流:通过缓存提高 IO 性能。
-
文件系统:理解文件系统的基本概念有助于更好地管理文件和目录。
在实际开发中,建议使用 try-with-resources
语句管理资源,并结合缓冲流提高 IO 效率。通过掌握这些知识,可以轻松应对文件操作和数据流处理的编程需求。