37.File
File类
用来将文件或者文件夹封装成对象
方便对文件与文件夹的属性信息进行操作
public class File_01 { public static void main(String[] args) { // TODO Auto-generated method stub consMethod(); } //创建File对象 public static void consMethod(){ //将a.txt封装成file对象。可以将已有的和未出现的文件或文件夹封装成对象 File f1=new File("d:\\a.txt"); //父目录+子文件 File f2=new File("d:\\abc","b.txt"); //文件夹+子文件 File d=new File("d:\\cons"); File f3=new File(d,"c.txt"); sop("f1:"+f1); sop("f2:"+f2); sop("f3:"+f3); } public static void sop(Object o){ System.out.println(o); } }
File类常见方法:
1.创建
boolean createNewFile(); 在指定位置创建文件,如果该文件已经存在,则不创建,返回false
和输出流不一样,输出流对象一建立就创建文件,文件已存在,会覆盖
boolean mkdir():创建文件夹
boolean mkdirs():创建多级文件夹
2.删除
boolean delete(); 删除失败返回false
void deleteOnExit(); 在程序退出时删除指定文件
3.判断
boolean exists():文件是否存在
isDirectory();
isFile();
4.获取信息
getName()
getPath():相对路径
getParent()
getAbsolutePath():绝对路径
lastModified()
length()
public class File_02 { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //method_1(); //method_2(); //method_3(); method_4(); //method_5(); } //创建、删除文件 public static void method_1() throws IOException{ File f=new File("d:\\file.txt"); //只是根据指定path生成了一个文件流而已 sop("create:"+f.createNewFile()); sop("delete:"+f.delete()); } //创建文件夹 public static void method_2(){ File f=new File("d:\\file.txt"); //sop("excute:"+f.canExecute()); //sop("exists:"+f.exists()); //创建文件夹 File dir=new File("d:\\abc\\e\\f\\g\\h\\i\\j"); File dir1=new File("d:\\abc\\e\\f\\g\\h"); //sop("mkdir:"+dir.mkdir()); //只能创建一级目录 sop("mkdirs:"+dir1.mkdirs());//可创建多级目录 } //判断文件、文件夹 public static void method_3(){ File f=new File("d:\\newfile.txt"); f.mkdir(); //带后缀的不一定就是文件,也可以是文件夹 //记住在判断文件对象是否是文件或者目录时,必须要先判断该文件对象封装的内容是否存在。通过exists()判断 sop("directory:"+f.isDirectory()); sop("file:"+f.isFile()); } //获取信息 public static void method_4(){ File f=new File("buf.txt"); sop("path:"+f.getPath()); sop("absolutePath:"+f.getAbsolutePath()); sop("parent:"+f.getParent()); //该方法返回的是绝对路径中的文件父目录。如果获取的相对路径,返回null。如果相对路径中有上一层目录,那么该目录就是返回结果。 sop("length:"+f.length()); } //重命名 public static void method_5(){ File f1=new File("d:\\buf.txt"); File f2=new File("d:\\haha.java"); sop("rename:"+f1.renameTo(f2)); } public static void sop(Object o){ System.out.println(o); } }
文件列表
public class File_03 { public static void main(String[] args) { // TODO Auto-generated method stub //listRootsDemo(); listDemo_1(); System.out.println("-------------------"); //listDemo_2(); listDemo_3(); } //文件 目录 public static void listDemo_1(){ File f=new File("d:\\aaa"); String [] names=f.list(); //当前目录文件、文件夹名称。调用list方法的file对象必须是封装了一个目录。该目录还必须存在 for(String name:names){ System.out.println(name); } } public static void listDemo_2(){ File dir=new File("d:\\aaa"); String [] arr=dir.list(new FilenameFilter(){ public boolean accept(File dir,String name){ /*System.out.println("dir"+dir); System.out.println("name"+name); if(name.endsWith(".java")){ return true; } return false;*/ return name.endsWith(".java"); } }); System.out.println("len:"+arr.length); for(String name:arr){ System.out.println(name); } } //list()返回文件的名字,listFiles()返回文件 public static void listDemo_3(){ File dir=new File("d:\\aaa"); File [] files=dir.listFiles(); for(File f:files){ System.out.println(f.getName()+":"+f.length()); } } //有效盘符 public static void listRootsDemo(){ File [] files=File.listRoots(); //有效盘符 C:\ D:\ E:\ for(File f:files){ System.out.println(f); } } }
列出指定目录下文件或者文件夹,包含子目录中的内容。
即列出指定目录下所有内容
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出目录过程中出现的还是目录的话,还可以再次调用本功能。也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归。
递归要注意:
1.限定条件
2.要注意递归的次数,尽量避免内存溢出。
public class File_DiGui_04 { public static void main(String args[]){ File dir=new File("D:\\workspace"); showDir(dir); //toBin(6); //System.out.println(getSum(10)); } public static void showDir(File dir){ System.out.println(dir); File [] files=dir.listFiles(); for(int x=0;x<files.length;x++){ if(files[x].isDirectory()){ showDir(files[x]); }else{ System.out.println(files[x]); } } } public static int getSum(int n){ if(n==1){ return 1; }else{ return n+getSum(n-1); } } public static void toBin(int num){ while(num>0){ toBin(num/2); System.out.println(num%2); //num=num/2; } } }
删除一个带内容的目录
删除原理:
在window中,删除目录是从里面往外删除的。
既然是从里往外 删除,就需要用到递归
public class File_05 { public static void main(String[] args) { // TODO Auto-generated method stub File dir=new File("d:\\abc"); removeDir(dir); //remove(dir); } public static void removeDir(File dir){ File [] files=dir.listFiles(); for(int x=0;x<files.length;x++){ if(files[x].isDirectory()){ removeDir(files[x]); }else{ System.out.println(files[x].toString()+"::file::"+files[x].delete()); } } System.out.println(dir+"::dir::"+dir.delete()); } //为删除文件夹内文件,无法删除。此目录必须为空才能删除 public static void remove(File dir){ File [] files=dir.listFiles(); System.out.println(dir.delete()); } }
练习:
将一个指定目录下的Java文件的绝对路径,存储到一个文本文件中。
建立一个java文件列表清单
思路:
1.对指定的目录进行递归
2.获取递归过程中所有java文件的路径
3.将这些路径存储到集合中
4.将集合中的数据写入到一个文件中
public class File_06 { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //将目录存入List File dir=new File("d:\\abc"); List<File> list=new ArrayList<File>(); fileToList(dir,list); File file=new File(dir,"javalist.txt"); writeToFile(list,file.toString());//返回此抽象路径名的路径名字符串 } public static void fileToList(File dir,List<File> list){ File [] files=dir.listFiles(); for(File file:files){ if(file.isDirectory()){ fileToList(file,list); }else{ if(file.getName().endsWith(".java")){ list.add(file); } } } } public static void writeToFile(List<File> list,String javaListFile) throws IOException{ BufferedWriter bufw=null; try { bufw=new BufferedWriter(new FileWriter(javaListFile)); for(File f:list){ String path=f.getAbsolutePath(); bufw.write(path); bufw.newLine(); bufw.flush(); } } catch (IOException e) { throw e; }finally{ if(bufw!=null){ bufw.close(); } } } }