zoukankan      html  css  js  c++  java
  • 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应该会体验好点吧.

     

  • 相关阅读:
    《你的灯还亮着吗》读后感1
    找"1"
    阅读计划---《梦断代码》3
    阅读计划---《梦断代码》2
    个人工作总结(10)
    个人工作总结(9)
    个人工作总结(8)
    个人工作总结(7)
    学习进度条
    个人工作总结(6)
  • 原文地址:https://www.cnblogs.com/fylx/p/3988237.html
Copyright © 2011-2022 走看看