一、传统 IO 流拷贝
通过 InputStream
和 OutputStream
手动读写字节,适合需要中间处理(如过滤数据)的场景,但代码较繁琐。
核心步骤
- 创建文件输入流(
FileInputStream
)和输出流(FileOutputStream
)。 - 定义缓冲区(
byte[]
),循环读取源文件数据并写入目标文件。 - 关闭流
public class StreamCopy {
public static void main(String[] args) {
try (InputStream in = new FileInputStream("source.txt");
OutputStream out = new FileOutputStream("target.txt")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
System.out.println("文件拷贝成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
二 . commons.io
org.apache.commons.io.FileUtils
是 Apache Commons IO 工具库提供的工具类,封装了丰富的文件操作方法,包括便捷的文件拷贝功能,能极大简化传统 IO 流的繁琐代码,是实际开发中常用的工具。
FileUtils 的核心拷贝 API
方法签名 | 功能描述 |
---|---|
copyFile(File srcFile, File destFile) | 拷贝单个文件,若目标文件存在会抛出异常 |
copyFile(File srcFile, File destFile, boolean preserveFileDate) | 拷贝文件时可选择是否保留源文件的修改时间 |
| 核心区别在于 目标路径的处理方式 不同 |
copyInputStreamToFile(InputStream src, File destFile) | 将输入流内容写入文件 |
deleteDirectory(File dir) | 递归删除整个目录(含内容),目录本身也会被删除 |
cleanDirectory(File dir) | 清空目录内容(保留空目录本身),删除所有子文件、子目录 |
readFileToString(File file, Charset encoding) | 按指定编码读取文件内容为字符串,适合小文件(大文件慎用,易内存溢出) |
write(File file, CharSequence data, String encoding) | 按指定编码向文件写入内容(覆盖原内容,需确保父目录存在) |
*//* FileUtils类 static void copyFile(File srcFile, File destFile) 复制文件 static void copyDirectory(File srcDir, File destDir) 复制文件夹 static void copyDirectoryToDirectory(File srcDir, File destDir) 复制文件夹 static void deleteDirectory(File directory) 删除文件夹 static void cleanDirectory(File directory) 清空文件夹 static String readFileToString(File file, Charset encoding) 读取文件中的数据变成成字符串 static void write(File file, CharSequence data, String encoding) 写出数据
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class FileUtilsDemo {
public static void main(String[] args) {
File source = new File("source.txt");
File target = new File("target.txt");
try {
// 拷贝文件,自动处理流的关闭
FileUtils.copyFile(source, target);
System.out.println("拷贝成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
IOUtils 类(流操作)
方法签名(简化) | 功能说明 |
---|---|
copy(InputStream in, OutputStream out) | 拷贝输入流到输出流(自动处理缓冲区,高效且无需手动关流),返回拷贝的字节数 |
copyLarge(Reader in, Writer out) | 类似 copy ,但针对大文件 / 流(如超过 2GB)优化,返回拷贝的字符数 |
readLines(Reader in) | 按行读取流内容,返回 List<String> ,适合文本文件逐行处理 |
write(String data, OutputStream out) | 直接将字符串写入输出流(自动处理编码为 UTF-8,无需手动转字节) |
IOUtils类 public static int copy(InputStream input, OutputStream output) 复制文件 public static int copyLarge(Reader input, Writer output) 复制大文件 public static String readLines(Reader input) 读取数据 public static void write(String data, OutputStream output) 写出数据 */
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
public class CommonsIODemo1 {
public static void main(String[] args) {
// 【场景 6:文件读/写(字符串操作)】
fileReadWriteDemo();
// 【场景 7:流拷贝(大文件/自定义流)】
streamCopyDemo();
}
// 6. 文件读写(字符串方式,适合小文件)
public static void fileReadWriteDemo() {
File file = new File("myio/content.txt");
try {
// 写入内容(覆盖原文件)
FileUtils.write(file, "Hello Commons IO!\n", StandardCharsets.UTF_8);
// 追加内容(第二个参数设为 true 表示追加)
FileUtils.write(file, "这是追加的内容~", StandardCharsets.UTF_8, true);
// 读取文件为字符串
String content = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
System.out.println("文件内容:\n" + content);
} catch (IOException e) {
e.printStackTrace();
}
}
// 7. 流拷贝(自定义输入输出流场景,如网络流、带业务逻辑的流)
public static void streamCopyDemo() {
// 模拟:从文件读(InputStream),写入另一个文件(OutputStream)
try (InputStream in = new FileInputStream("myio/source.txt");
OutputStream out = new FileOutputStream("myio/target.txt")) {
// 拷贝流(自动处理缓冲区,高效且无需手动关流)
int copiedBytes = IOUtils.copy(in, out);
System.out.println("流拷贝完成,拷贝字节数:" + copiedBytes);
// 额外演示:按行读取流内容(适合文本处理)
try (Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
List<String> lines = IOUtils.readLines(reader);
System.out.println("流内容按行读取:");
for (String line : lines) {
System.out.println(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}