java基础--IO流之File类
一、File类概述
用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作,File对象可以作为参数传递给流的构造函数
二、File类常见方法:
1,创建
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返false, 和输出流不一样,
输出流对象一建立创建文件,而且文件已经存在,会覆盖。
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹。
2,删除
boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
void deleteOnExit();在程序退出时删除指定文件。
3,判断
boolean exists() :文件是否存在.记住在判断文件对象是否是文件或者路径时,
必须要先判断该文件对象封装的内容是否存在。
isFile(): isDirectory();isHidden();isAbsolute();
4,获取信息
getName(): getPath(): getAbsolutePath() long lastModified() long length()
getParent():该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。七
File常见方法演示代码
package cn.xushuai.io; import java.io.*; class FileDemo { public static void main(String[] args) throws IOException{ method_1(); //method_5(); } public static void method_1()throws IOException{ File f = new File("file.txt"); // sop("create:"+f.createNewFile());//创建文件,如果已存在,则不再创建 //sop("delete:"+f.delete()); //删除文件 } public static void method_2(){ File f = new File("file.txt"); //sop("exists:"+f.exists()); //sop("execute:"+f.canExecute()); //创建多级文件夹 File dir = new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa"); sop("mkdir:"+dir.mkdirs()); } public static void method_3()throws IOException{ File f = new File("d:\\java1223\\day20\\file2.txt"); //f.createNewFile(); //f.mkdir(); //记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。 //通过exists判断。 sop("dir:"+f.isDirectory()); sop("file:"+f.isFile()); sop(f.isAbsolute());//文件不存在。也可以 } public static void method_4(){ File f = new File("file.txt"); sop("path:"+f.getPath());//返回所封装的路劲 sop("abspath:"+f.getAbsolutePath()); //获取绝对路径,即使是相对的路径也可以 sop("parent:"+f.getParent());//该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。 //如果相对路径中有上一层目录,那么该目录就是返回结果。 } public static void method_5(){ File f1 = new File("c:\\Test.java"); File f2 = new File("d:\\hahah.java"); sop("rename:"+f2.renameTo(f1));//重新命名此抽象路径名表示的文件 } public static void sop(Object obj){ System.out.println(obj); } }
File练习
练习一:获取文件列表:
package cn.xushuai.io; import java.io.File; import java.io.FilenameFilter; import java.util.Iterator; public class FileDemo2 { public static void main(String[] args) { // TODO Auto-generated method stub //listRootsDemo(); listFileDemo(); //listDemo(); //listFilterDemo(); } //列出可用的文件系统根 public static void listRootsDemo(){ File[] files = File.listRoots(); for (File file : files) { System.out.print(file); } } //返回一个文件对象数组 public static void listFileDemo(){ File file = new File("D:\\Java\\java课程\\毕向东\\Java基础\\day20"); File[] files = file.listFiles(); for(File f : files){ System.out.println(f+"...."+f.getName()+"....."+f.length()); } } public static void listDemo(){ File file = new File("D:\\Java\\java课程\\毕向东\\Java基础\\day20"); //返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录 String[] names = file.list(); //调用list方法的file对象必须是封装了一个目录。该目录还必须存在 for(String name: names){ System.out.println(name); } } //获取指定文件类型的文件 public static void listFilterDemo(){ File dir = new File("D:\\Java\\java课程\\毕向东\\Java基础\\Java基础源代码\\day14"); String[] names = dir.list(new FilenameFilter(){ public boolean accept(File dir,String name){ //System.out.println("dir:"+dir+"....name::"+name); /*if(name.endsWith(".java")) return true; else return false;*/ return name.endsWith(".java"); } }); for(String name : names){ System.out.println(name); } } }
练习二:列出指定目录下文件或者文件夹,包含子目录中的内容
示例说明:
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,还可以再次调用本功能。
也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归。
递归注意事项:
1,限定条件
2,要注意递归的次数。尽量避免内存溢出。
由于在没有符合限定条件时,每次调用都会开辟一个新的内存空间由于存放方法,
但是这些内存都不能释放。只有符合限定条件,才能一步步往回执行,占用大量内存
package cn.xushuai.io; import java.io.File; public class FileDemo3 { public static void main(String[] args) { // TODO Auto-generated method stub File file = new File("D:\\Java\\java课程\\毕向东\\Java基础\\Java基础源代码"); //showDir(file); System.out.println(getSum(10)); showDir(file,0); } //通过递归列出某个文件夹下的所有内容 public static void showDir(File dir,int level){ System.out.println(getLevel(level)+"...."+dir.getName()); level++; File[] files = dir.listFiles(); for(int x=0;x<files.length;x++){ if(files[x].isDirectory()) showDir(files[x],level); else System.out.println(getLevel(level)+files[x].getName()+"...."); } } //在列表前添加级数 public static String getLevel(int level){ StringBuilder sb = new StringBuilder(); sb.append("|--"); for(int i=0;i<level;i++){ sb.insert(0,"| "); } return sb.toString(); }
练习三:将一个指定路径下的文件列表写入到一个本地文件中
这里将指定路径下的所有文件对象先存储到集合中去,然后将集合中的对象写入到本地文件:对象的持久化
存入集合是为了可以有更多的操作选择,打印,写入都可。
思路:
1,对指定的目录进行递归。
2,获取递归过程所以的java文件的路径。
3,将这些路径存储到集合中。
4,将集合中的数据写入到一个文件中。
package cn.xushuai.io; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class JavaFileList { public static void main(String[] args) { List<File> list = new ArrayList<File>(); File file = new File("D:\\Java\\java课程\\毕向东\\Java基础\\Java基础源代码\\day20"); File file2 = new File("c:\\javalist2.txt"); list = file2List(list,file); try { write2File(list,file2.toString()); } catch (IOException e) { System.out.println("写入失败!"); } } //将文件内容存入集合 public static List file2List(List list,File dir){ File[] files = dir.listFiles(); for(int x=0;x<files.length;x++){ if(files[x].isDirectory()) file2List(list,files[x]); else{ if(files[x].getName().endsWith(".java")) list.add(files[x]); } } return list; } //将集合中的内容存入文件 public static void write2File(List<File> list,String fileName)throws IOException{ BufferedWriter bufr = null; try { bufr = new BufferedWriter(new FileWriter(fileName)); for(File f : list){ String path = f.getAbsolutePath(); bufr.write(path); //bufr.write(f.toString()); bufr.newLine(); bufr.flush(); } } catch (IOException e) { throw e; }finally{ if(bufr!=null) try { bufr.close(); } catch (IOException e) { throw e; } } } }
练习四、删除带内容的目录
删除原理:
在window中,删除目录从里面往外删除的
既然是从里往外删除。就需要用到递归
import java.io.*; class RemoveDir{ public static void main(String[] args) { File dir = new File("d:\\testdir"); removeDir(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()); } }