文件的复制

FileInputStream(字节流方式)

FileInputStream 从文件系统中的某个文件中获得输入字节

看如下示例:

package IOPractice;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
 * 将file1文件复制到file2文件里
 */
publicclass CopyFile {
    //复制音频文件
//  private static String file1 = "D:/Test/陈奕迅 - 浮夸.mp3";
//  private static String file2 = "D:/Test/aa/bb.mp3";
    //复制视频文件
//  private static String file1 = "D:/Test/嵌套子查询.wmv";
//  private static String file2 = "D:/Test/aa/bb.wmv";
    //复制图片
//  private static String file1 = "D:/Test/05.jpg";
//  private static String file2 = "D:/Test/aa/bb.jpg";
    //复制文字文档文件
    privatestatic String file1 = "D:/Test/c.txt";
    privatestatic String file2 = "D:/Test/aa/bb.txt";
   
    publicstaticvoid main(String[] args) {
       try {
           //字节输入流
           FileInputStream fis = new FileInputStream(file1);
           FileOutputStream fos = new FileOutputStream(file2);
           //字节输出流
           byte[] b = newbyte[1024];
           while((fis.read(b))!=-1){
              fos.write(b);
           }
           fis.close();
           fos.flush();
           fis.close();
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }
    }
}

 

从以上示例代码中可以看到:

我们的目的是想将file1这个文件复制到file2这个文件里,对于file1,我们分别用音频文件、视频文件、图片和文档文件做了实验,运行结果显示,都是可以实现复制功能的,而且file2这个文件还可以正常的使用和查看,说明了FileInPutStream这种方式是可以对音频文件、视频文件、图片和文档文件进行操作的,而且不会产生什么问题

 

BufferedReader(字符流方式)

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取

看如下示例:

package IOPractice;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
/**
 * 将file1文件复制到file2文件里
 */
publicclass BufferedRWDemo {
    //复制音频文件
    // private static String file1 = "D:/Test/陈奕迅 - 浮夸.mp3";
aa/bb.mp3";
    // 复制视频文件
wmv";
aa/bb.wmv";
    // 复制图片
jpg";
aa/bb.jpg";
    // 复制文字文档文件
    privatestatic String file1 = "D:/Test/c.txt";
    privatestatic String file2 = "D:/Test/aa/bb.txt";
 
    publicstaticvoid main(String[] args) {
       try {
           BufferedReader br = new BufferedReader(new FileReader(file1));
           BufferedWriter bw = new BufferedWriter(new FileWriter(file2));
           String s = null;
           while ((s = br.readLine()) != null) {
              bw.write(s + "\r\n");
           }
           br.close();
           bw.flush();
           bw.close();
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }
    }
}

 

从以上示例代码中可以看到:

我们的目的是想将file1这个文件复制到file2这个文件里,对于file1,我们分别用音频文件、视频文件、图片和文档文件做了实验,运行结果显示,都是可以实现复制功能的,但是复制后的音频文件、视频文件、图片打不开,只有文档文件能正常打开,说明了BufferedReader这种方式不能对音频文件、视频文件和图片进行操作,只能对文档文件

 

总结:

有些人在这里就有疑问了:那我们应该在什么时候用FileInputStream这种方式、什么时候采用BufferedReader这种方式呢?

这就取决于你需要要操作的对象是什么了。如果你操作的对象是图片、音频和视频文件的话,那么就选择FileInputStream;如果操作对象是文字内容的文档的话,就选择BufferedReader,因为BufferedReader对图片、音频和视频文件的操作会使原文件产生损坏,不能播放。

那么又会有人会问了,那万一有个文件夹里,既存在图片、音频和视频文件,又存在文字文档文件,现在又想将这个文件夹复制到另外一个地方,怎么实现这个操作呢?

 

文件夹的复制

在理解上面的基础上,再看如下小示例即可明白了:

package IOPractice;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
 * 将文件夹"D:/Test"里的所有内容复制到"D:/Test1"里
 */
publicclass MyFileCopy {
    publicstaticvoid main(String[] args) throws IOException {
       copyFile("D:/Test", "D:/Test1");
    }
    //文件复制操作
    publicstaticvoid copyFile(String file1, String file2) throws IOException{
       File in = new File(file1);//源文件
       File out = new File(file2);//目标文件
       if(!in.exists()){//源文件不存在时
           System.out.println(in.getAbsolutePath()+"源文件路径错误");
       }else{//源文件存在时
           System.out.println("源文件路径" + in.getAbsolutePath());
           System.out.println("目标路径" + out.getAbsolutePath());
       }
       if(!out.exists()){
           out.mkdirs();//如果目标文件夹不存在,则自动创建
       }
       //将源文件中的文件放入file数组中
        File[] file = in.listFiles();
       //定义字节输入流和输出流
       FileInputStream fis = null;
       FileOutputStream fos = null;
       for(int i=0; i<file.length; i++){
           if(file[i].isFile()){
              //如果从file中拿出来的是文件,则开始copy操作
              fis = new FileInputStream(file[i]);
              fos = new FileOutputStream(new File(file2+"/"+file[i].getName()));
              byte[] b = newbyte[1024*10];
              int c;
              while((c = fis.read(b)) != -1){
                  fos.write(b,0,c);
                  System.out.println("文件复制中..");
              }
              fis.close();
              fos.flush();
              fos.close();
           }else{
              //如果从file中拿出来的是文件夹,则反复执行此方法
               copyFile(file1+"/"+file[i].getName(),file2+"/"+file[i].getName());
           }
       }
    }
}

 

以上代码的功能为:将文件夹"D:/Test"里的所有内容复制到"D:/Test1"里

而且复制得到的所有文件都是正常的,没有损坏