首页 > 代码库 > 黑马程序员-JAVA学习之文件夹的复制和遍历所有文件

黑马程序员-JAVA学习之文件夹的复制和遍历所有文件

 --------android培训java培训、期待与你交流!--------

 

JAVA的文件夹复制由于不知道文件夹里面有多少文件夹,所以使用递归方法遍历里面的所有文件夹和文件,
如果是文件,则直接复制到目标文件夹,如果是文件夹,则的目标地方创建对应的同名文件夹,由于文件有各种各样的类型,
比如视频,文档,图片等.所以要用到的主要是字节流对象,而不是用字符流对象,
在这里用到的几个类分别是

 

1.File类,
文件和目录路径名的抽象表示形式。(即表示既可以是一个文件,也可以是一个文件夹,是一个有分隔符的字符串)
注意:File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。
常用的成员有:
static String separator 字段,与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。在Unix中的分隔符是"/",而在Windows中分隔符是"\\"
File(String pathname) 构造函数,通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。


boolean exists()
测试此抽象路径名表示的文件或目录是否存在。


String getName()
返回由此抽象路径名表示的文件或目录的名称。(只是名字,包括扩展名,不包括路径,如:xxxx文件,xxxx文件夹)


String getPath()
将此抽象路径名转换为一个路径名字符串。(一个包括全名字和全路径的字符串)


boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录。


boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件。


File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。(包括所有这个文件夹下面的文件和文件夹)


boolean mkdir()
创建此抽象路径名指定的目录。(在指定目录下创建一个文件夹,如果创建成功,返回true,要求有父目录)


boolean mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。(在指定目录下创建一个文件夹,如果创建成功,返回true,如果没有父目录,则创建父目录和父父目录......)

 

 


2.FileInputStream 类
从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
常用成员有:
FileInputStream(File file)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。


FileInputStream(String name)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。(即一个文件的全路径)


int read(byte[] b)
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已经到达文件末尾而没有更多的数据,则返回 -1。


void close()
关闭此文件输入流并释放与此流有关的所有系统资源。

 

 

 

3.FileOutputStream 类
文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。
常用成员有:
FileOutputStream(File file)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。


void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。


void close()
关闭此文件输出流并释放与此流有关的所有系统资源。

 

简单示例代码如下:

 

//import java.io.*;class FileMove{    public static void main(String[] args)    {        try{        //传入两个文件夹路径,其中在Windows中使用的分隔符是"\\"        CopyFile("D:\\5555","D:\\1234");        }        catch(Exception ex){}        System.out.println("Copy File is over!");        }        //复制文件夹的方法,开始的时候是两个文件夹    public static void CopyFile(String source,String destin) throws Exception //在这里直接抛出各种异常,就不一一处理了    {        File path1=new File(source);        File path2=new File(destin);                //如果源目录不存在,那就不用复制了,        if(path1.exists())        {            //Create destination folder,如果目标目录不存在,就创建目标目录,因为没有目录文件复制不过去的            if(!path2.exists())            {                path2.mkdirs();            }                        //取得源目录下面的所有文件和文件夹                        //可以想要更好一点,加上缓冲类BufferedInputStream和BufferedOutputStream,对付大文件时会好一点            File[] items=path1.listFiles();            FileInputStream fis=null;            FileOutputStream fos=null;                        //取得所有文件和文件夹之后,遍历处理,如果是文件,就复制文件,如果是文件夹,则递归文件夹下面的文件和文件夹            for(File item:items)            {                //如果是文件才进行复制                if(item.isFile())                {                    //输入输出流的两个常用构造函数,其中在用来了一个字段File.separator,先用输入流读取文件,然后用输出流写文件到目标位置,完成复制功能                    fis=new FileInputStream(item);                    fos=new FileOutputStream(path2+File.separator+item.getName());                    byte[] b=new byte[1024];                    for(int i=0;(i=fis.read(b))!=-1;)                    {                        fos.write(b,0,i);                        fos.flush();                    }                                        //close the Stream关闭资源啊,什么异常处理的就不写,自己补上吧                    fos.close();                    fis.close();                                                    }                //如果是文件夹,递归文件夹                else                {                    CopyFile(item.getPath(),path2+File.separator+item.getName());                }            }                    }        else        {            System.out.println("source path:"+source+" is not exists!");        }            }}//


以上代码算是尽量简单的了,当然如果在实际应用中应该把所有的异常捕捉补上,还有关闭资源的方式也不标准,不过为了方便大家思路跟上眼睛,多余的东西就不写的.
还有如果要复制大文件的话,可以加止缓冲类来缓冲,如:类BufferedInputStream和BufferedOutputStream应该会体验好点吧.

 

黑马程序员-JAVA学习之文件夹的复制和遍历所有文件