------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
使用FileReader和FileWriter实现文件复制,但是推荐使用copy_2因为使用字符数组一次读取多个字符到内存会省去很多的读写时间
com.chuanzhi.sin;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//将目录下的一个文件复制一份
public class CopyText {
/** * @param args
* 复制原理: 将目录下的文件拷贝一份 步骤:
* 1,创建一个copy文件用于存储要复制的文件数据。
* * 2.定义读取流与要复制的文件关联
* 3.通过不断读写完成文件存储
* 4.关闭资源 */
public static void main(String[] args) {
copy_1("RunTime.java");
copy_2("RunTime.java");
}
private static void copy_2(String path) {
FileWriter fw = null;
FileReader fr = null;
try { // 创建目标文件
fw = new FileWriter(path + "_copy2.txt", true);
fr = new FileReader(path);
int len = 0;
// 用于存储读取到的字符长度
char[] buf = new char[1024];
// 定义字符数组用于存储读取到的文件数据,流的缓冲区大小为2K
//小于2K的文件只需要进行一次读取就能将文件全部读入到数据流中,可以一次性写入到文件中,而大于2K的文件需要进行多次读取
while ((len = fr.read(buf)) != -1) {
//读取到文件末尾时返回-1表示文件读取结束
fw.write(buf, 0, len);
//将读取到buf中的数据一次性写入到复制的文件中,0表示读取开始的位置,len表示buf中的长度
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("文件读写失败!!");
} finally {
//不能将fw.close()和fr.close()写到一个try。。catch中,因为如果前一个执行过程中如果出现异常,另一个将无法关闭
try {if (fw != null)fw.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fr != null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 一个字符一个字符从C盘向D盘复制
private static void copy_1(String path) {
FileWriter fw = null;
FileReader fr = null;
try {// 创建目标文件
fw = new FileWriter(path + "_copy.txt", true);
fr = new FileReader(path);// 定义读取流与文件关联
int ch = 0;
while ((ch = fr.read()) != -1) {
// 读写完成文件存储
fw.write((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
} finally {// 关闭流对象
try {if (fw != null)fw.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fr != null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
图片为传志老师画出的FileReader和FileWriter实现文件复制,给出了用字符数组复制文件的详细流程