I/O编程——文件拷贝
一、什么是流
1.I/O流的基本概念
二、File文件操作
1.File类
在 Java 的Java.io 包中有一个类叫File, 一个File 磁盘上的文件或者目录, 可以通过调用File的方法。创建、 删除、 隐藏文件等,File 对象主要用于获取文件的一些信息,如获取文件路径、 文件长度等,数据流可以将数据写入到文件中, 而文件也是数据流最常用的数据媒体。
2.File类的使用
文件是磁盘中的一部分,如果要使用 File 类进行文件的创建, 必须要掌握这个类中一些常用方法,在Java的API文档中可以查看到这些方法,File类的常用方法:

三、什么是字节流
1.OutputStream字节输出流
要想完成数据的输出,必须借助OutputStream的子类才能完成对象的实例化, 因为OutputStream是 抽 象 类,没 有 办 法 创 建 对 象。所 以 接 下 来 要 学 习OutputStream 子 类的Java.io.FileOutputStream,FileOutputStream的常用方法。

三个构造方法的使用:

四、什么是字符流
1.Writer字符输出流及其子类FileWriter

三种构造方法的使用:
构造方法 1:public FileWriter(File file) throws IOException{...}方法是通过File 对象指定文件传输的路径,这个路径必须存在,如果不存在, 程序会出错,找不到文件。

3.转换流InputStreamReader和OutputStreamWriter
字符输出流 Winder和字符输入流Reader是字符输出流和字符输入流的父类,由于它们是抽象类。 没有办法创建对象, 所以我们学习了它们的子类 FileWriter 和FileReader, 但是由于编码方式不同,所以在读写文件的时候难免出现乱码的情况,用字节数组读取字节文件,比如文本文件中是字符串时, 读取就会出现问题, 因为FileOutputStream /FileInputStream没有办法指定编解码方式,所以使用字符输出流读取文本文件更加方便。

五、字节流与字符流的区别
字符输出数据操作流程

六、过滤流
FilterInputStream fi = new FilterInputStream("JZLG.txt" ); DateInputStream di = new DateInputStream(fi); inti = di.readInt(); // 读取整型数据 di.close();
FilterInputStream fo = new FilterInputStream("JZLG.txt" ); DateInputStream do = new DateInputStream(fo); ds.writeBytes("ZNXY"); //写入字符串 ds.close();
七、RandomAccessFile
RandomAccessFile流是 IO中功能比较强大的一个流,它既支持数据的读取,又支持数据的写操作,它可以到文件的任意位置去读写数据,可以任意控制文件指针,所以如果只想访问文件的某一部分内容, 或者在文件中追加内容, 就可以使用
RandomAccessFile流,RandomAccessFile 类包含了一个记录指针, 用以标识当前读写处的位置,当程序新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是 0 处),当读/ 写了 n 个字节后, 文件记录指针将会向后移动 n 个字节,除此之外,RandomAccessFile 可以自由地移动记录指针,既可以向前移动,也可以向后移动,RandomAccessFile 包含了以下两个方法来操作文件的记录指针。
(2)void seek(long pos), 将文件记录指针定位到 pos位置。

八、对象序列化和反序列化
1.对象序列化和反序列化

九、文件拷贝
1.任务描述
2.任务实现步骤
class FileKB{ FilelnputStream fis = null; BufferedlnputStream bis= null; FileOutputStream fos = null; BufferedOutputStream bos = null; public void kaoWenJian( String strl, String str2){ //源文件路径。 File filel = new File(strl); //目标文件路径。 File file2 = new File( str2); //获取原文件的所有文件。 File [] files =filel. listFiles(); //遍历原文件。 for( int i=0;i<files. length;i++) //判断是否是文件,是文件就复制文件 if( files[i]. isFile())! File ywjUrl= files[i]; File mbUrl = new File (file2.toString()+File.separator+files [i]. getName()); //调用拷贝文件方法copyFiles(File filel, File file2); copyFiles ( ywjUrl, mbUrl); } //如果是目录就调用拷贝目录的方法copyDir(File filel, File file2); if( files[i]. isDirectory()) copyDir( files[i] , new File( file2, files[i]. getName())); } } } //拷贝文件 public void copyFiles(File ywjUrl, File mbUrl) { try{ //创建字节输入流和缓冲流。 fis = new FilelnputStream(ywjUrl); bis = new BufferedlnputStream(fis); //创建字节输出流和缓冲流。 fos =new FileOutputStream (mbUd); bos =new BufferedOutputStream (fos); byte[]bs =new byte[1024] ; while(true){ int in =bis. read(bs); if(in==-1) break; //把读到的文件写道到目标文件中。 bos. write(bs, 0, in); } }catch (Exception e){ // TODO Auto-generated catch block e. printStackTrace(); }finally{ try{ //刷新缓冲流。 bos. flush(); //关闭流。 bis, close(); bos. close(); }catch (IOException e){ // TODO Auto-generated catch block e. printStackTrace(); } } } //拷贝目录 public void copyDir( File oldUrl, File newUrl){ //判断在目标文件中有没有img文件夹,没有就创建。 if(! newUrl. exists()){ newUrl. mkdirs(); } //获取原文件的所有文件。 File [] files = oldUrl. listFiles(); //遍历源文件。 for( int i=0;i<files. length; i++){ //如果是文件就拷贝 if (files [i]. isFile ()){ copyFiles ( files[i] , new File (newUrl, files[i]. getName ())); //如果是目录,递归调用copyDir(),目的是找到文件中的子文件和目录。 }else if( files [i]. isDirectory()){ copyDir(files [i] , new File(newUrl, files[i]. getName ())) ; } } } }
(5)主函数,程序运行的入口类。
public class TestKBFile{ public static void main (String[] args){ // TODO Auto-generated method stub String strl ="F:/myfiles" ; String str2="E:/img" ; FilekB filekb = new FilekB(); filekb. ma(strl, str2); } }
浙公网安备 33010602011771号