在 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 效率。通过掌握这些知识,可以轻松应对文件操作和数据流处理的编程需求。