---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
流对象只能够操作文件,但是不能操作文件夹
File类的出现就弥补了流对象的缺点,因为file既能够操作文件,也能够操作文件夹
格式:
(1)File f1 = new File("d:\\test");
(2)File f2 = new File("abc.txt");
(3)File f3 = new File("d:\\test","abc.txt");
(4)File f1 = new File(f1,f2);
如果直接打印对象,输出的就是自定义的地址
例File f3 = new File("d:\\test","abc.txt");
System.out.println(f3);
输出结果为:d:\test\abc.txt
创建文件的方法:boolean createNewFile():如果创建成功,会返回一个boolean值
例:
File f1 = new File("d:\\test","sdf.txt");
f1.createNewFile();//注意,只能用于创建文件,不是创建文件夹
控制台结果为:true //如果目录上原本不存在sdf.txt这个文件,创建成功就返回true
如果已存在,那么创建失败,返回false
需要注意的是:这个和输入流的创建流时的创建文件有区
别,输入流的如果已存在同名文件,那么会覆盖该文件
错误的创建写法:File f1 =new File("d:\\test");
f1.createNewFile("sdf.txt");
// createNewFile()是一个空参数的方法,不能传入参数
分两种情况讨论:
1操作文件示例
File file = newFile(“d:\\test\\a.txt”);
file.renameTo(“d:\\test\\b.txt”);//当前目录下,renameTo起的是重命名功能
file.renameTo(“f:\\abc\\b.txt”);//在不同目录下,renameTo起的是剪切+重命名功能(d:\\test\\下的a.txt文件已经不存在了)
2操作文件夹示例
File file = newFile(d:\\test);
file.renameTo(“d:\\abc”);//对于非空的文件夹,只能作用于同一路径,起重命名的功能,不能剪切
renameTo对空的文件夹操作文件夹,可以剪切
File f = newFile("ab.txt");
//将已有或没有的文件或文件夹封装成File
File f2 = newFile("d:\\test\\Day19","out.txt");
File f3 = new File("d:\\test\\Day19");
File f4 = newFile(f3,"syst.text");
//sop(f);
//sop(f2);
//sop(f4);//只打印路径,封装什么就打印什么
File f5=new File("d:"+File.separator+"test"+File.separator+"Day19");
sop(f5);;
/*File.separator是代表跨平台的反斜杠,在windows下可以识别
子linux系统下也能够识别
要注意的是File.separator后面没有跟括号
File.separator()是错误的 */
删除文件的方法:boolean delete();
能够删除文件和空的文件夹(不能删除非空的文件夹)
从里往外删除,把最里面的一个个删除,再删上一级目录,逐级删除向上,用到递归操作
如果存在隐藏文件,则文件目录删不掉,就如同C盘中的某些文件夹,是删不删的,如果要删掉,必须把隐藏文件给删掉
删除一个非空文件夹的思路:
(1)listFile(),取得一个存有所有文件目录和文件数组
(1)for()循环输出每个文件或文件目录
(3)判断是否属于目录,如果属于目录,再判断目录是否为null,不为null,则递归调用此方法,如果属于文件,则用delete()删除
注意的细节:在递归调用删除一个文件夹里的所有文件之后,必须再删除此空目录,同理,在遍历删除完根目录下的文件和文件夹后,要删除根目录
用法示例:
public static void delAllFile(File file) {//遍历打印目录下的所有文件和文件夹 File[] files = file.listFiles(); for(File fis:files) { if(fis.isDirectory())//判断是否属于目录 { if(fis.listFiles().length==0)//判断目录是否为空 { fis.delete();//删除该目录 System.out.println(fis.getName()+"删除成功"); } else { delAllFile(fis); 目录不为空则递归调用 fis.delete();//删除空目录 System.out.println(fis.getName()+"删除成功"); } } else { fis.delete();//属于文件,直接删除 System.out.println(fis.getName()+"删除成功"); } } file.delete();//删除根目录 }
特殊的删除方法:void deleteOnExit();没有返回值
这个方法的用处是在使用一些临时文件的时候,在使用中不能删除,在使用完毕,退出后自动删除,其实就是标记该文件,告诉计算机,退出时删除
需求:剪切一个非空的目录到另外一个根目录下
代码:
public static void catFile(File source, File destination) { if (source.isDirectory()) { File[] files = source.listFiles(); if (files != null) { for (File f : files) { File dest = new File(destination, source.getName()); if (dest.exists() == false) { dest.mkdir(); } catFile(new File(source, f.getName()), dest);//递归 } } } if (source.renameTo(new File(destination, source.getName())) == false) { source.delete(); } }
判断执行方法:boolean canExcute();是否能够执行(前提是存在此文件),能返回ture,不存在或不能执行则返回false
boolean exist();如果存在此文件,返回ture,不存在返回false
两者区别:?
前面说的是针对文件的操作,创建,删除
创建文件夹的方法:
File f1 = newFile("d:\\test\\cz");//此处传入想要创建的文件夹的目录和文件夹名
f1.mkdir();//这个也是空参数方法,不用传入参数
需要注意的是:mkdir()只能创建一级目录,这个的理解就是,只能创建一个文件夹的意思
如果想要创建多级目录,java也提供了一个创建多级文件目录的方法
Boolean mkdirs();创建多级目录,可以理解成是
isFile()判断文件对象是否属于文件,如果属于文件,则返回true,不属于则false
isDirectory()判断文件对象是否属于目录,如果属于目录,则返回true,不属于则false
在判断文件对象是否是文件或者是目录的时候,一定要先判断这个文件对象是否存在,如果连需要判断的这个文件对象都不存在,那么判断则会出错,这里的出错指的是,不判断,直接返回false
注意:isDirectory()和isFile()这个两个方法能够判断隐藏目录,就算是隐藏文件和目录,也能够做出正确的判断
endsWith();
用法示例:
Files.getName.endsWith(“.java”);
这个就是判断文件名是否包含“.java”这个字符串,起到的作用也就是查找java文件
isHidden()判断当前文件是不是隐藏文件,且仅当此抽象路径名表示的文件属于隐藏文件,那么返回true,否则false,问题?:是判断文件,而不是判断文件夹,所以,使用此方法前,必须先判断isFile()吗?
getPath():获取文件的路径,如果封装成相对路径,就显示相对路径,绝对路径就显示绝对路径,取决于封装方式(可以理解为传什么就返回什么)
File f1 = new File(“abc.txt”);
File f2 = new File(“d:\\cd\\abc.txt”);
System.out.println(f1.getPath());
System.out.println(f2.getPath());
两者的输出结果如下:
abc.txt
d:\\cd\\abc.txt
getAbsolutePath():获取文件的绝对路径,无路是封装了还是没封装,返回的都是绝对路径
示例:
File f1 = new File(“abc.txt”);
File f2 = new File(“d:\\cd\\abc.txt”);
System.out.println(f1.getAbsolutePath());
System.out.println(f2.getAbsolutePath());
两者的输出结果如下:
d:\\cd\\abc.txt
d:\\cd\\abc.txt
getParent():返回的是绝对路径的文件的父目录(上级目录)
示例:
File f1 = new File("D:\\test\\cz\\MyCar.java");
System.out.println(f1.getParent());
输出结果为:D:\test\cz
listRoots():
获取文件系统的根目录,返回值类型是一个staticFile[],是一个数组
示例:
File[] f1 = File.listRoots()
For(File f:f1)
System.out.println(f);
输出结果为:
C:\
D:\
E:\
F:\
List();遍历获取当前目录下的文件和文件夹,包括隐藏文件,返回一个String[](注意是字符串数组)
listFiles():遍历获取当前目录下的文件和文件夹,不包括隐藏文件 , 返回一个File[](注意是文件数组)
public static void main(String[] args) { File dir = new File("d:\\test"); showDir(dir); } public static void showDir(File dir) { File[] files = dir.listFiles(); for(int i=0; i<files.length; i++) { System.out.println(files[i]); } }
输出结果:
D:\test\cz>java FileDemo3
d:\test\cz 这是一个文件夹
d:\test\Day11 这是一个文件夹
d:\test\Day19 这是一个文件夹
d:\test\GessNum.java 这是一个文件
d:\test\TestByte.class 这是一个文件
d:\test\TestByte.java 这是一个文件
d:\test\TestByte.java.bak 这是一个文件
public static void main(String[] args) { File dir = new File("d:\\test"); showDir(dir); } public static void showDir(File dir) { File[] files = dir.listFiles(); for(int i=0; i<files.length; i++) { if(files[i].isDirectory())//判断是否属于文件夹 { showDir(files[i]);//如果属于文件夹,就进入文件及,递归调用,遍历 } else System.out.println(files[i]);如果不属于文件夹,则打印 } }
那么这个的输出会遇到文件夹会进入文件夹中遍历
递归的次数要特别地注意,内存会溢出,因为每一次的递归都是要开辟栈内存去存储上一次的结果,而且上一层的结果依赖于下一层的结果,如果递归的次数太多,在还没有计算出最低层的值得时候,栈内存就会被占满
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。