1、计算机复制文件的原理?
原理:计算机中的文件都是以字节为单位的,当复制文件时,首先读取待复制文件,然后将读取到的信息写入到目的文件中去。
方式:IO流中复制文件提供两种方式,字节流和字符流。
(1)字节流输入输出功能:InputStream(输入,用于读取);和OutputStream(输出,用于写出)。主要用来处理字节或二进制流对象(图片、音频、视频等)。
(2)字符流输入输出功能:Reader(输入,用于读取)和 Writer(输出,用于写出)。主要用来处理单元为2个字节的Unicode字符或字符串,适用于中文文本操作。
读写流量:可以选择每次读写一个字符、一个字符数组、一个字节、一个字节数组四种方式。
注意:计算机中所有文件都是以字节为单位的储存,即使用字符流操作,在磁盘上保留的也不是文件的字符而是先把字符解析成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是将相邻的两个字节组成一个字符来读取的。
字节流是通用的流,可用于任何类型的对象,包括二进制流对象,而字符流只能处理字符或者字符串。
需求:将项目路径(相对路径)下的FAITH.java文件复制到d盘下,目的文件取名Copy.java。
分析:这是对文本的操作,使用字符流来进行操作。
读取数据:FAITH.java,使用 FileReader 。
写入数据:d:\\Copy.java,使用 FileWriter 。
代码实现:
(1)每次读一个字符:
public class CopyFile {
public static void main(String[] args) throws IOException {
// 封装数据源
FileReader fr = new FileReader("FAITH.java");
// 封装目的地
FileWriter fw = new FileWriter("d:\\Copy.java");
// 读取数据,每次读一个字符
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
// 释放资源,关闭遵循就近原则,fw最近,先关fw
fw.close();
fr.close();
}
}
(2)每次读一个字符数组:
public class CopyFile {
public static void main(String[] args) throws IOException {
// 封装数据源
FileReader fr = new FileReader("FileWriterDemo.java");
// 封装目的地
FileWriter fw = new FileWriter("d:\\Copy.java");
//每次读一个字符数组
char[] chs = new char[1024];
int len = 0;
while ((len = fr.read(chs)) != -1) { // <span style="font-family: Arial;">fr.read(chs))表示每次读一个字符数组</span>
//写入数据.
fw.write(chs,0,len); // len是读到数据的实际长度
}
// 释放资源,关闭遵循就近原则,fw最近,先关fw
fw.close();
fr.close();
}
}
小结:
字节流基本流,也是通用流,主要用于处理二进制流数据,但是实际中很多数据是文本形式,所以又提出的字符流概念,在使用中,对文本形式数据主要用字符流进行操作;二进制流数据操作选做字节流操作,如果使用字符流会导致数据丢失。