Java文件与IO操作详解
文件操作类:File
在java.io包中,若要对文件本身进行操作(如创建、删除等),需依赖java.io.File类。以下是File类的常用方法:
| 方法 | 类型 | 描述 |
|---|---|---|
public File(String path) |
构造方法 | 指定完整路径 |
public File(File parent, String child) |
构造方法 | 设置父路径与子文件路径 |
boolean createNewFile() throws IOException |
普通方法 | 创建新文件 |
boolean exists() |
普通方法 | 判断路径是否存在 |
boolean delete() |
普通方法 | 删除指定路径的文件 |
File getParentFile() |
普通方法 | 获取当前路径的父路径 |
boolean mkdirs() |
普通方法 | 创建多级目录 |
long length() |
普通方法 | 获取文件大小(以字节为单位) |
boolean isFile() |
普通方法 | 判断路径是否是文件 |
boolean isDirectory() |
普通方法 | 判断路径是否是目录 |
long lastModified() |
普通方法 | 获取文件最后修改时间 |
String[] list() |
普通方法 | 列出目录中的所有内容 |
File[] listFiles() |
普通方法 | 列出所有路径并返回File对象数组 |
示例代码展示如何使用File类操作文件:
package com.example;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
File file = new File("d:" + File.separator + "test.txt");
if (file.exists()) {
file.delete();
} else {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
为了跨平台定义路径,可以使用File.separator常量:
File file = new File("d:" + File.separator + "test.txt");
多级目录创建
当需要创建带有路径的文件时,应先判断父路径是否存在,如果不存在则创建:
File file = new File("d:" + File.separator + "folder" + File.separator + "subfolder" + File.separator + "example.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
获取文件信息
可以通过以下代码获取文件或目录的相关信息:
File file = new File("d:" + File.separator + "mypicture.png");
if (file.exists()) {
System.out.println("是否是文件:" + file.isFile());
System.out.println("是否是目录:" + file.isDirectory());
System.out.println("文件大小:" + file.length() / 1024.0 / 1024.0 + " MB");
System.out.println("上次修改时间:" + new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date(file.lastModified())));
}
列出目录内容
使用listFiles()方法列出目录下的所有文件和子目录:
File dir = new File("d:" + File.separator);
if (dir.isDirectory()) {
File[] files = dir.listFiles();
for (File f : files) {
System.out.println(f.getAbsolutePath());
}
}
递归列出所有子目录及文件:
public static void printFiles(File file) {
if (file.isDirectory()) {
File[] subfiles = file.listFiles();
if (subfiles != null) {
for (File f : subfiles) {
printFiles(f);
}
}
}
System.out.println(file.getAbsolutePath());
}
字节流与字符流
字节输出流:OutputStream
OutputStream用于写入字节数据,其常用方法如下:
| 方法 | 描述 |
|---|---|
void close() |
关闭流 |
void flush() |
强制刷新缓冲区 |
void write(int b) |
写入单个字节 |
void write(byte[] b) |
写入字节数组 |
void write(byte[] b, int off, int len) |
写入部分字节数组 |
示例代码展示如何使用FileOutputStream写入数据:
File file = new File("d:" + File.separator + "output.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try (FileOutputStream fos = new FileOutputStream(file)) {
String content = "Hello World!";
fos.write(content.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
字节输入流:InputStream
InputStream用于读取字节数据,其常用方法如下:
| 方法 | 描述 |
|---|---|
int read() |
读取单个字节 |
int read(byte[] b) |
将数据读取到字节数组中 |
int read(byte[] b, int off, int len) |
将数据读取到部分字节数组中 |
示例代码展示如何使用FileInputStream读取数据:
File file = new File("d:" + File.separator + "input.txt");
if (file.exists()) {
try (FileInputStream fis = new FileInputStream(file)) {
byte[] buffer = new byte[1024];
int bytesRead = fis.read(buffer);
System.out.println(new String(buffer, 0, bytesRead));
} catch (Exception e) {
e.printStackTrace();
}
}
字符输出流:Writer
Writer用于写入字符数据,其常用方法如下:
| 方法 | 描述 |
|---|---|
void close() |
关闭流 |
void flush() |
强制刷新缓冲区 |
void write(String str) |
写入字符串 |
void write(char[] cbuf) |
写入字符数组 |
示例代码展示如何使用FileWriter写入数据:
File file = new File("d:" + File.separator + "output.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try (FileWriter writer = new FileWriter(file)) {
writer.write("Hello World!");
} catch (Exception e) {
e.printStackTrace();
}
字符输入流:Reader
Reader用于读取字符数据,其常用方法如下:
| 方法 | 描述 |
|---|---|
int read() |
读取单个字符 |
int read(char[] cbuf) |
将数据读取到字符数组中 |
long skip(long n) |
跳过指定数量的字符 |
示例代码展示如何使用FileReader读取数据:
File file = new File("d:" + File.separator + "input.txt");
if (file.exists()) {
try (FileReader reader = new FileReader(file)) {
char[] buffer = new char[1024];
int charsRead = reader.read(buffer);
System.out.println(new String(buffer, 0, charsRead));
} catch (Exception e) {
e.printStackTrace();
}
}
字节流与字符流的区别
- 字节流直接操作字节数据,适合处理二进制文件(如图片、音频等)。
- 字符流通过缓冲区处理字符数据,适合处理文本文件,并支持字符编码转换。