来给大家详细讲解一下如何用Java IO实现文件复制的操作。
1. Java IO简介
Java IO库提供了一组类和接口,用于执行输入和输出(I/O)以及序列化。I/O就是指通过网络或其他外部层面,传输控制台,文件或任何Java代码与外部世界交互的数据。Java IO库还包括两个包,即java.io和java.nio,用于处理不同类型的输入,输出和序列化。
2. Java IO文件复制方法
文件复制是一项常用的操作。在Java中,我们主要分为两种方式来实现文件复制操作:使用基于流的方法或使用NIO2.0中的FileChannel(文件通道)。
2.1 使用流实现文件复制
使用流实现文件复制,一般分为两种方式,分别为字节流和字符流。其中,字节流是在复制图像文件或二进制文件时使用的最常用方法,而字符流更适合在复制文本文件时使用。
2.1.1 使用字节流实现文件复制
字节流使用InputStream读取文件,一个字节一个字节地处理,而OutputStream将处理的结果写入另一个文件。使用字节流的文件复制操作步骤如下:
public static void copyFileUsingByteStream(File source, File dest) throws IOException {
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(source);
output = new FileOutputStream(dest);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buf)) > 0) {
output.write(buf, 0, bytesRead);
}
} finally {
input.close();
output.close();
}
}
在上述代码中,首先我们使用FileInputStream和FileOutputStream分别定义了源文件(source)和目标文件(dest)的输入流和输出流。然后,我们使用了buf数组缓存字节数据,从而相应地改进了传输速度。
2.1.2 使用字符流实现文件复制
字符流使用Reader读取文件,一个字符一个字符地处理,而Writer将处理的结果写入另一个文件。使用字符流的文件复制操作步骤如下:
public static void copyFileUsingCharStream(File source, File dest) throws IOException {
Reader input = null;
Writer output = null;
try {
input = new FileReader(source);
output = new FileWriter(dest);
char[] buf = new char[1024];
int bytesRead;
while ((bytesRead = input.read(buf)) > 0) {
output.write(buf, 0, bytesRead);
}
} finally {
input.close();
output.close();
}
}
在上述代码中,首先我们使用FileReader和FileWriter分别定义了源文件(source)和目标文件(dest)的输入流和输出流。然后,我们使用了buf缓存字符数据,从而相应地改进了传输速度。
2.2 使用NIO2.0中的FileChannel实现文件复制
Java NIO提供了一种全新的I/O模式,用于处理相对较大的文件和大量并发访问,是Java IO库的替代品,它主要用于提高传统I/O流文件I/O的性能。使用FileChannel进行文件复制的操作步骤如下:
public static void copyFileUsingFileChannel(File source, File dest) throws IOException {
FileChannel inputChannel = null;
FileChannel outputChannel = null;
try {
inputChannel = new FileInputStream(source).getChannel();
outputChannel = new FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
} finally {
inputChannel.close();
outputChannel.close();
}
}
在上述代码中,我们使用了FileInputStream / FileOutputStream获取通道对象,并使用transferFrom()方法直接一次性传输文件内容。由于它不涉及缓存数组的分配,因此很快会快。
3. 示例展示
我们接下来使用两个具体的示例,来展示Java IO文件复制的具体操作:
3.1 示例一:使用基于流的方法,复制二进制文件
import java.io.*;
public class CopyExample1 {
public static void main(String[] args) throws IOException {
File sourceFile = new File("input.mp4");
File destFile = new File("output.mp4");
copyFileUsingByteStream(sourceFile, destFile);
}
public static void copyFileUsingByteStream(File source, File dest) throws IOException {
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(source);
output = new FileOutputStream(dest);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buf)) > 0) {
output.write(buf, 0, bytesRead);
}
} finally {
input.close();
output.close();
}
}
}
在上述代码中,我们使用copyFileUsingByteStream()方法完成了文件复制操作,并复制了启动时指定的二进制文件。运行示例,可以在当前工作目录中生成一个新文件。
3.2 示例二:使用FileChannel复制文本文件
import java.io.File;
import java.io.IOException;
public class CopyExample2 {
public static void main(String[] args) throws IOException {
File sourceFile = new File("input.txt");
File destFile = new File("output.txt");
copyFileUsingFileChannel(sourceFile, destFile);
}
public static void copyFileUsingFileChannel(File source, File dest) throws IOException {
FileChannel inputChannel = null;
FileChannel outputChannel = null;
try {
inputChannel = new FileInputStream(source).getChannel();
outputChannel = new FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
} finally {
inputChannel.close();
outputChannel.close();
}
}
}
在上述代码中,我们使用用copyFileUsingFileChannel()方法完成了文件复制操作,并复制了启动时指定的文本文件。运行示例,可以在当前工作目录中生成一个新文件。
以上是Java IO文件复制的完整攻略,我们介绍了Java IO库的基本概念,以及如何使用基于流的方法和FileChannel实现文件复制。我们还实现了两个示例,分别是用字节流复制二进制文件和用FileChannel复制文本文件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:实例讲述Java IO文件复制 - Python技术站