首页 > 代码库 > 黑马程序员-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学习之文件夹的复制和遍历所有文件