1、IO流实现文件的拷贝
示例代码:问题:如何把C盘的文件复制到D盘中?
复制原理:1、在D盘创建一个文件进行存储数据;
2、定义读取流和C盘中的文件关联;
3、通过不断地读取和写入完成数据存储;
4、关闭资源。
1)用read()和writer()方法,每读一个文件中的字符,就往目标文件写一个字符
import java.io.*;
public class FileCopyDemo {
public static void main(String args[])throws IOException{
FileWriter fw=new FileWriter("D:\\Demo_Copy.txt");//定义文件存储目的地
FileReader fr=new FileReader("C:\\Demo.txt");//与已有文件关联
int ch=0;
while((ch=fr.read())!=-1)//程序每读一个C盘文件中的字符,就会往D盘的目标文件写一个字符
{
fw.write(ch);
}
fw.close();
fr.close();
}
}
2)如果文件较大的话,用方法1)会大大降低存储效率,如果利用IO流提供的缓冲存储的方式,可以先将文件中的数据读取到缓冲当中,再一并写入到目标文件中,这样可以大大提高存储速度。
示例代码:
package twentytwoApril;
import java.io.*;
public class FileCopyDemo {
public static void main(String args[]){
FileWriter fw=null;
FileReader fr=null;
try{
fw=new FileWriter("D:\\Demo_Copy.txt");
fr=new FileReader("C:\\Demo.txt");
char[] buf=new char[1024];//定义一个数组缓冲区,存储读取出的数据
int len=0;
while((len=fr.read(buf))!=-1)
{
fw.write(buf,0,len);//将缓冲区的数据写入到目标文件中
}
}
catch(IOException e)
{
throw new RuntimeException("文件读写失败");
}
finally{
if(fr!=null)
try{
fr.close();
}
catch(IOException e)
{
}
if(fw!=null)
try{
fw.close();
}
catch(IOException e)
{
}
}
}
}
2、字符流的缓冲区
缓冲区的出现是为了提高对文件读写的效率
缓冲区所对应的类:BufferedWriter,BufferedReader分别是Writer类和Reader类的子类。
缓冲区要结合流才能使用:BufferedWriter(Writer out) , BufferedWriter(Writer out , int sz) ,BufferedReader(Reader in),BufferedReader(Reader in, int sz)
缓冲区使用前提:必须存在一个流对象。
缓冲区的使用方法:只需要将定义好的流对象作为一个参数传递给对应的缓冲区对象的构造函数即可,缓冲区对象也同样可以使用其父类所提供的方法,如writer(),reader()等等。
代码片段:FileWriter fw=new FileWriter("xxx.*");
BufferedWriter bufw=new BufferedWriter(fw);
BufferedWriter类所提供的一个新方法:newLine() ,作用是写入一个行分隔符,它的优点在于跨平台性
BufferedReader类所提供的一个新方法:readLine() ,作用是能够对文件的一行进行读取,当读到文件末尾的时候,返回null
3、使用缓冲区进行文件复制
可以使用readLine方法进行读取文件,以提高读取速度,需要注意的是readLine方法返回的时候只返回回车符之前的内容,并不返回回车符,所以在进行数据写入的时候,要加上newLine方法。
4、readLine方法的原理
readLine方法其实是基于read方法,它在内存中创建了一个字符串数组,用read方法读取文件一行的字符存到数组中,当遇到回车"\r\n"字符的时候,返回已经存到数组中的文件中某一行的字符。
5、装饰设计模式
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有功能并提供加强功能,自定义的该类成为装饰类。
装饰设计模式和继承的对比:
1)装饰设计模式是使用构造函数进行参数传递,来增强已有功能;
2)如果为了增加某个功能而产生子类(使用继承),那么这个体系会变得臃肿;
3)装饰类要比继承更加灵活,装饰类只是用来增强已有对象的功能,它们属于同一个体系,所以避免了继承体系的臃肿,而且降低了类与类的关系