黑马程序员-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应该会体验好点吧.

时间: 2024-10-09 23:01:04

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

黑马程序员-JAVA学习日记-数组YNPB

黑马程序员学习笔记黑马程序员编程基础数组培训.培训.期待与您交流!数组:是存储同一种数据类型的的集合,也叫容器:特点:是数组中每个元素都有索引从开始:数组的定义式:数据类型数组名数据类型元素个数:数据类型数组名数据类型元素个数:如:数据类型数组名数据类型元素数据类型数组名元素如:如果元素确定就用这一种:数组中有一个属性:获取数组中的元素个数,即数组的长度:中的内存机制:栈:存储局部变量,一般定义在函数内的变量成为局部变量:特点:当内存中数据操作完成后,所占空间会自动释放栈内存堆:是通过创建的实体

黑马程序员——JAVA学习笔记十一(文件操作File)

为了很方便的代表文件的概念,以及存储一些对于文件的基本操作,在java.io包中设计了一个专门的类——File类. 在File类中包含了大部分和文件操作的功能方法,该类的对象可以代表一个具体的文件或文件夹,所以以前曾有人建议将该类的类名修改成FilePath,因为该类也可以代表一个文件夹,更准确的说是可以代表一个文件路径. 1.创建文件 1)boolean java.io.File.createNewFile() throws IOException用来创建文件,如果文件存在,创建失败,返回fa

黑马程序员——JAVA学习笔记十(IO)

1,    可以从其中读入一个字节序列的对象成为输入流,可以向其中写入一个字节序列的对象就做输出流.这些字节序列的来源地可以是文件,也可以是网络连接或者内存块.抽象类InputStream和OutputStream构成了I/O层次的基础.因为字节流不便于处理以Unicode存储的信息,所以有了Writer和Reader抽象类,这些从其中继承的类都是读入和写入基于2个字节的Unicode码元,而不是单个字节.   2,    InputStream 与OutputStream: abstract

黑马程序员——java学习13(毕20--21总结)——IO

1.File 1.1.增删判获 1 package learn2; 2 /*File类的常见方法: 3 * 1.创建 4 * boolean createNewFile();//在指定位置创建如果,如果该文件已存在,则不创建,返回false; 5 * 输出流会覆盖 6 * boolean mkdir();//创建文件夹 7 * mkdirs();//创建多级文件夹 8 * 9 * 2.删除 10 * boolean delete();//删除失败,返回 false 11 * void delet

黑马程序员——JAVA学习笔记十四(高新技术三)

10 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代

黑马程序员——JAVA学习笔记五(异常)

1,     异常:是在运行时期发生的不正常情况. 在java中用类的形式对不正常情况进行了描述和封装对象.描述不正常的情况的类,就称为异常类. 以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问题处理代码分离,提高阅读性. 其实异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述. 不同的问题用不同的类进行具体的描述.比如角标越界.空指针异常等等. 问题很多,意味着描述的类也很多,将其共性进行向上抽取,形成了异常体系. 不正常情况分成了两大类: Throwabl

黑马程序员——java学习12(毕18--总结)——IO

1.IO流 处理设备之间的数据传输 字符流为了处理文字而存在,基于字节流,其中融合了编码表 1.1.Writer--------write,flush,close java.util.FileWriter FileWriter(String fileName)根据给定的文件名构造一个FileWriter对象 java.io.OutputStreamWriter void write(String str, int off, int len)将数据写入流中 void flush()刷新流中的缓冲

黑马程序员-JAVA学习之银行业务调度系统分析与实现

--------android培训.java培训.期待与你交流!-------- 银行业务调度系统 模拟实现银行业务调度系统逻辑,具体需求如下:1 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口.2 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费.电话费之类业务的客户).3 异步随机生成各种类型的客户,生成各类型用户的概率比例为:VIP客户 :普通客户 :快速客户 = 1 :6 :3.4 客户办理业务所需时间有最大值和最小值,在该

黑马程序员——JAVA学习笔记十三(高新技术二)

8,    注解 Annotation(注解)是JDK5.0及以后版本引入的. 注解是以 @注解名 的形式标识 注解不会影响程序语义,只作为标识 注解是新的类型(与接口很相似),它与类.接口.枚举是在同一个层次,它们都称作为java的一个类型(TYPE). 它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释. 它的作用非常的多,例如:进行编译检查.生成说明文档.代码分析等 注释类型 是一种特殊的接口 用 @interface 声明如 [email prote