1. 基本文件流 (FileInputStream
和 FileOutputStream
)
原理
基本文件流通过逐字节读取和写入文件来实现文件复制。这种方法简单直接,但效率较低。
使用场景
适用于小文件或对性能要求不高的场景。
优缺点
优点:
- 实现简单,容易理解。
- 适用范围广,适用于所有类型的文件。
缺点:
- 性能较低,因为每次只读取和写入一个字节。
- 需要手动管理资源,容易出错。
代码示例
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class BasicFileCopy {public static void main(String[] args) {File srcFile = new File("source.txt");File destFile = new File("destination.txt");try (FileInputStream in = new FileInputStream(srcFile);FileOutputStream out = new FileOutputStream(destFile)) {int data;while ((data = in.read()) != -1) {out.write(data);}} catch (IOException e) {e.printStackTrace();}}
}
输出结果
假设 source.txt
的内容为:
Hello, World!
执行上述代码后,destination.txt
的内容将是:
Hello, World!
2. 带缓冲的文件流 (BufferedInputStream
和 BufferedOutputStream
)
原理
带缓冲的文件流通过使用缓冲区来减少 IO 操作的次数,从而提高文件复制的效率。
使用场景
适用于大文件或对性能要求较高的场景。
优缺点
优点:
- 性能高,使用缓冲区减少了 IO 操作的次数。
- 适用范围广,适用于所有类型的文件。
缺点:
- 比基本文件流稍微复杂一点,但仍然容易理解。
代码示例
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class BufferedFileCopy {public static void main(String[] args) {File srcFile = new File("source.txt");File destFile = new File("destination.txt");try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(srcFile));BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(destFile))) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}} catch (IOException e) {e.printStackTrace();}}
}
输出结果
假设 source.txt
的内容为:
Hello, World!
执行上述代码后,destination.txt
的内容将是:
Hello, World!
3. 基于字符串的操作 (StringBuilder
)
原理
基于字符串的操作将文件内容读取到一个字符串中,然后可以对字符串进行处理,最后将处理后的字符串写入目标文件。
使用场景
适用于需要对文件内容进行处理的小型文本文件。
优缺点
优点:
- 灵活性高,可以在复制过程中对文件内容进行处理。
- 适用于文本文件。
缺点:
- 不适合大文件,将整个文件读入内存可能会导致内存溢出。
- 不适合二进制文件。
代码示例
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class StringFileCopy {public static void main(String[] args) {File srcFile = new File("source.txt");File destFile = new File("destination.txt");try (FileInputStream in = new FileInputStream(srcFile);FileOutputStream out = new FileOutputStream(destFile)) {StringBuilder content = new StringBuilder();int data;while ((data = in.read()) != -1) {content.append((char) data);}content.append(" Additional content");out.write(content.toString().getBytes());} catch (IOException e) {e.printStackTrace();}}
}
输出结果
假设 source.txt
的内容为:
Hello, World!
执行上述代码后,destination.txt
的内容将是:
Hello, World! Additional content
4. 基于字符流的操作 (BufferedReader
和 PrintWriter
)
原理
基于字符流的操作通过按行读取文件内容,并将每行写入目标文件。这种方法适合处理文本文件。
使用场景
适用于按行处理的文本文件,特别是需要在复制过程中对每行内容进行处理的场景。
优缺点
优点:
- 适合文本文件,按行处理文件内容。
- 灵活性高,可以在复制过程中对每行内容进行处理。
缺点:
- 不适合二进制文件。
- 对于非常大的文件,按行读取可能会导致内存问题。
代码示例
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;public class BufferedReaderFileCopy {public static void main(String[] args) {File srcFile = new File("source.txt");File destFile = new File("destination.txt");try (BufferedReader reader = new BufferedReader(new FileReader(srcFile));PrintWriter writer = new PrintWriter(destFile)) {String line;while ((line = reader.readLine()) != null) {writer.println(line);}} catch (IOException e) {e.printStackTrace();}}
}
输出结果
假设 source.txt
的内容为:
Hello, World!
执行上述代码后,destination.txt
的内容将是:
Hello, World!
总结
根据不同的需求和文件类型,可以选择不同的文件复制方法:
- 基本文件流:适用于简单的文件复制任务,尤其是小文件。
- 带缓冲的文件流:适用于大文件复制,性能较高。
- 基于字符串的操作:适用于需要对文件内容进行处理的小型文本文件。
- 基于字符流的操作:适用于按行处理的文本文件。
在实际开发中,推荐使用带缓冲的文件流来进行文件复制,因为它在性能和适用范围上表现最佳。同时,使用 try-with-resources
语句可以简化资源管理,减少代码中的错误。