一、File类概述
File类位于java.io包中,是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类有多种重载的构造方法。File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的相对路径和绝对路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。File类操作文件的重要性有:
a:如何跨平台问题
b:文件编码问题,尤其是多语言平台情况下如何正常工作。
c:文件读写效率、操作效率
d:文件加密和文件安全
e:文件快速检索,强烈建议使用lence进行文件检索及文件管理。
二、File类的对象功能
1.创建和删除的操作
(1).创建文件
当我们创建文件时,先要产生File类的对象,可以通过File类的各种构造方法来获取该对象,然后在创建文件的时候,我们要先判断要创建的文件是否已存在,如果不存在,则创建,否则不创建,File类的构造方法有:
File(String pathName) 传递一个文本路径来创建对象
File(URI fileUri) 传递一个URI来创建对象
File(File fileDir,String fileName)
File(String,File)
File(String,int)
File(String filePath,String fileName)
下面演示一个创建文件的方法:
1 /*** 2 * 创建文件的方法 3 * @param fileName 4 */ 5 public static void creatFile(String fileName){ 6 File file=new File(fileName); 7 if(!file.exists())//判断文件是否存在 8 { 9 try{ 10 11 new File(file.getParent()).mkdirs();//建立上层文件夹 12 file.createNewFile();//创建文件,执行此语句才产生该文件 13 14 } 15 catch(IOException e){ 16 17 e.printStackTrace(); 18 19 } 20 } 21 else{ 22 23 System.out.println("文件已存在"); 24 25 } 26 //获取文件名 27 String filename=file.getName(); 28 //获取文件路径 29 String filePath=file.getPath(); 30 //获取文件绝对路径 31 String fileAbsolutePath=file.getAbsolutePath(); 32 //获取父亲文件路径 33 String parentPath=file.getParent(); 34 //获取父亲文件名 35 String parentName=new File(file.getParent()).getName(); 36 //获取文件大小 37 long size=file.length(); 38 //获取最后一次修改时间 39 long lastTime=file.lastModified(); 40 String filemsg="文件名:"+filename+"\n路径:"+filePath+"\n绝对路径: "+fileAbsolutePath+"\n父文件路径:"+parentPath; 41 filemsg+="\n文件大小"+size+"\n最后修改时间:"+new Timestamp(lastTime); 42 System.out.println(filemsg); 43 System.out.println("父亲节点文件夹名称"+parentName); 44 } 45 46 public static void main(String args[]){ 47 creatFile("E:\\Mytest.txt"); 48 }
运行结果如下:
文件已存在
文件名:Mytest.txt
路径:E:\Mytest.txt
绝对路径: E:\Mytest.txt
父文件路径:E:\
文件大小0
最后修改时间:2014-06-04 19:51:26.846
(2).移动文件
在某些情况下我们需要讲一个文件从某个地方移到另一个地方,并且对他重命名,这时我们可以使用File对象的renameTo(File toFile)方法来轻松实现,实现代码如下:
1 /**修改文件路径及名称,内容也一块移动过去了,相当于“移动” 2 * 3 *@param fromPath 4 *@param toPath 5 **/ 6 public static void refileName(String fromPath,String toPath){ 7 File file1=new File(fromPath); 8 File file2=new File(toPath); 9 //判断file2路径是否存在,不存在则创建 10 if(!file2.exists()){ 11 12 new File(file2.getParent()).mkdirs(); 13 14 } 15 file1.renameTo(file2); 16 //修改文件名称及路径 17 System.out.println(fromPath+"文件已移动及重命名到"+toPath); 18 19 } 20 21 public static void main(String args[]){ 22 refileName("E:\\Mytest.txt","F:\\test.txt"); 23 }
(3).文件复制
文件复制可以利用FileInputStream(File formFile)和FileOutputStream(File toFile)将一个文件复制到目的地,具体代码如下:
1 /**复制一个文件 * 2 * @param src 3 * @param des 4 * */ 5 public static void copyFile(String src, String des) 6 { 7 File file1 = new File(src); 8 File fileDir=new File(des);//产生文件的上层文件夹对象 9 String topath = des + "\\" + file1.getName(); 10 File file2 = new File(topath);//产生文件对象 11 if(!file1.exists()){ 12 13 System.out.print("原文件不存在!"); 14 } 15 if(!fileDir.exists()){ 16 17 fileDir.mkdirs();//创建文件夹 18 19 } 20 if(file2.exists()) { 21 22 file2.delete();//目标位置有该文件,则删除 23 24 } 25 try{ 26 27 InputStream inStream = new FileInputStream(file1); // 读入原文件 28 29 FileOutputStream fs = new FileOutputStream (file2); 30 31 byte[] buffer = new byte[4098]; 32 33 int byteread=0; 34 35 while ((byteread = inStream.read(buffer)) != -1) 36 { 37 fs.write(buffer, 0, byteread); 38 39 } 40 inStream.close(); 41 fs.close(); 42 System.out.println("文件复制成功,新路径为"+topath); 43 44 } 45 catch(IOException e) 46 { 47 e.printStackTrace(); 48 } 49 } 50 51 public static void main(String args[]){ 52 copyFile("F:\\test.txt","E:\\"); 53 }
(4).遍历文件夹中的文件
在遍历文件夹中的文件时,要用到递归的思想,其次要考虑当File对像还是文件夹时,继续递归,否则,打印文件文件名到控制台。利用File对象的listFiles()方法获得该路径下的文件或文件夹,然后递归。代码如下:
1 /** 2 * 遍历一个文件夹下的文件,并显示文件名称 3 * @param path 4 * */ 5 public static void searchFile(String path) 6 { 7 File file=new File(path); 8 File[] files=file.listFiles();//file下的文件或文件夹 9 System.out.println(path+"目录下的文件数有"+files.length); 10 for(File f:files) 11 { 12 if(f.isFile()) 13 { 14 System.out.println(f.getName()); 15 } 16 else if(f.isDirectory()) 17 { 18 searchFile(f.getPath());//递归 19 } 20 } 21 } 22 23 24 public static void main(String args[]){ 25 searchFile("F:\\服务"); 26 }
(5).复制文件夹或文件
复制一个目录中的所有文件,这个目录有可能是文件夹,所以要用到递归思想,代码如下:
1 /**复制一个文件 * 2 * @param src 3 * @param des 4 * */ 5 public static void copyFile(String src, String des) 6 { 7 File file1 = new File(src); 8 File fileDir=new File(des);//产生文件的上层文件夹对象 9 String topath = des + "\\" + file1.getName(); 10 File file2 = new File(topath);//产生文件对象 11 if(!file1.exists()){ 12 13 System.out.print("原文件不存在!"); 14 } 15 if(!fileDir.exists()){ 16 17 fileDir.mkdirs();//创建文件夹 18 19 } 20 if(file2.exists()) { 21 22 file2.delete();//目标位置有该文件,则删除 23 24 } 25 try{ 26 27 InputStream inStream = new FileInputStream(file1); // 读入原文件 28 29 FileOutputStream fs = new FileOutputStream (file2); 30 31 byte[] buffer = new byte[4098]; 32 33 int byteread=0; 34 35 while ((byteread = inStream.read(buffer)) != -1) 36 { 37 fs.write(buffer, 0, byteread); 38 39 } 40 inStream.close(); 41 fs.close(); 42 System.out.println("文件复制成功,新路径为"+topath); 43 44 } 45 catch(IOException e) 46 { 47 e.printStackTrace(); 48 } 49 } 50 51 /** 52 * 复制一个文件夹,从src拷贝到des,src里面可能是文件夹或文件。 53 * @param src 54 * @param des 55 * */ 56 public static void copyDir(String src,String des) 57 { 58 File file1=new File(src); 59 File file2=new File(des); 60 if(!file2.exists()) 61 { 62 file2.mkdirs(); 63 } 64 File[] files=file1.listFiles(); 65 for(File f:files) 66 { 67 if(f.isFile()) 68 { 69 copyFile(f.getPath(),des+"\\"+new File(f.getParent()).getName());//注意,目标路径要加上这一层文件夹的名称,作为下次调用的新目标路径 70 71 } 72 else if(f.isDirectory()) 73 { 74 copyDir(f.getPath(),des+"\\"+new File(f.getParent()).getName());//递归 75 } 76 } 77 } 78 79 80 public static void main(String args[]){ 81 copyDir("F:\\服务","e:\\服务"); 82 }
(6).删除某个目录下的文件和文件夹
如果该目录是文件则直接删除,否则利用递归思想,首先利用File对象的listFiles()方法获得所有文件或文件夹,然后利用for(Object o: Objects)来遍历其中的对象,判断该对象是否为文件,如果是文件则删除,否则继续递归。当把所有的文件删除后还要删除该文件夹,注意不要重复误删除。代码如下:
/** * 删除某个目录下的文件和文件夹,也包括该目录 * @param src * @param des * */ public static void deleteDir(String srcDir) { File file1=new File(srcDir); if(!file1.exists()) { System.out.print(srcDir+" 目录不存在!"); return; } if(file1.isFile()){ if(file1.delete()){ System.out.println("文件--"+file1.getAbsolutePath()+"删除成功"); }else{ System.out.println("文件--"+file1.getAbsolutePath()+"删除失败"); } return; } File[] files=file1.listFiles(); for(File f:files) { if(f.isFile()) { if(f.delete()){ System.out.println("文件--"+f.getAbsolutePath()+"删除成功"); }else{ System.out.println("文件--"+f.getAbsolutePath()+"删除失败"); } } else { deleteDir(f.getPath());//递归 } } if(file1.delete()){ System.out.println("文件夹--"+file1.getAbsolutePath()+"删除成功"); }else{ System.out.println("文件夹--"+file1.getAbsolutePath()+"删除失败"); } } public static void main(String args[]){ deleteDir("E:\\dd"); }