File类
文件和目录路径名的抽象表示形式。
用来将文件或者文件夹封装成对象;方便对文件与文件夹的属性信息进行操作。
File对象可以作为参数传递给流的构造函数。
了解File类中的常用方法。
File类常用方法
1,创建 boolean createNewFile();
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
在指定位置创建文件,如果文件已经存在,则不创建返回false
与输出流不同:输出流对象创建文件时,如果文件已经存在,会覆盖原有文件
boolean mkdir();//创建文件夹
boolean mkdirs();//创建多级文件夹
2,删除 boolean delete();删除成功返回true ;失败返回false
void deleteOnExit();在程序退出时删除指定文件
3,判断 boolean canExecute(); 测试应用程序是否可以执行此文件。可以和Runtime类配合使用
exists();文件或目录是否存在。
在判断文件对象是否是文件或者目的时,必须要先判断该对象封装的内容是否存在
isFile();
判断是否是文件,
isDirectory();是否是目录
isHidden();
是否隐藏
isAbsolute();是否绝对路径
4,获取信息
getName();
getPath();获取相对路径字符串
getParent();返回绝对路径的父目录,相对路径没有父目录,则返回null,如果有上层目录,那么该目录就是返回结果
getAbsolutePath();//抽象路径名的绝对路径名字符串
lastModified();//返回文件最后一次被修改的时间
length();
文件大小
5,修改信息
renameTo(File f);修改文件名称及路径,成功则返回true
示例:
import java.io.*; class FileDemo { public static void main(String[] args) throws IOException { // consMethod(); method_5(); } public static void method_5() { File f1 = new File("c:\Demo.java"); File f2 = new File("G:\haha.java"); sop("renameTo: "+f1.renameTo(f2));//改文件名及路径 } public static void method_4() { File f = new File("G:\a.txt"); sop("path: "+ f.getPath());//获取相对路径 sop("absolutePath: "+f.getAbsolutePath());//获取绝对路径 sop("parent: "+f.getParent());//返回绝对路径的父目录,相对路径没有父目录,则返回null } //如果相对路径中有上层目录,那么该目录就是返回结果 public static void method_3() throws IOException { File f = new File("file.txt"); f.createNewFile();//创建文件 f.mkdir(); //创建目录,名称为file.txt的文件夹 sop("dir: "+ f.isDirectory());//在判断文件对象是否是文件或者目的时,必须要先判断该对象封装的内容是否存在 sop("file: "+ f.isFile()); //通过exist()判断 } public static void method_2() { File f = new File("file.txt"); // sop("execute: "+f.canExecute());//判断是否能执行 // sop("exists: "+f.exists()); //判断是否存在 File dir = new File("abc\fd\df\df"); //创建抽象路径对象 sop("mkdirs: "+dir.mkdirs()); //根据该对象创建文件夹 } public static void method_1() throws IOException { File f = new File("file.txt"); f.deleteOnExit(); //在程序退出时删除指定文件 // sop("creat: "+ f.createNewFile());//1,创建成功返回true,如果文件已存在返回false sop("delete:"+f.delete()); //2,删除,成功删除返回true,失败返回false } public static void consMethod() //构造方法演示 { //file可以将已有的和未出现的文件或者文件夹封装成对象 File f1 = new File("a.txt");//将a.txt封装成file对象, File f2 = new File("G:\haha","b.txt"); File d = new File("c:\haha");//将目录和文件拆分,可以更加自由的定义 File f3 = new File(d,"c.txt"); sop("f3: "+f3); File f4 = new File("c:"+File.separator+"haha"+File.separator+"abc"+"a.txt"); } //使用跨平台的分隔符seprator,增强代码健壮性 public static void sop(Object obj){ System.out.println(obj); } }
文件列表
获取文件列表的方法:
listRoots()列出可用的文件系统根
list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
该file对象必须封装了一个目录,而且该目录必须存在,否则方法返回null
listFiles()返回File对象,该目录下的文件和文件名File对象,能够操作对象,所以更加常用
list(FilenameFilter filter);过滤流; FilenameFilter接口,仅有的accept()方法
import java.io.*; class FilesDemo2 { public static void main(String[] args) { // listRootsDemo(); // listDemo_2(); listFilesDemo(); } public static void listFilesDemo()// { File dir = new File("G:\"); File[] files = dir.listFiles();//由File对象组成的数组 for (File f:files ) { sop(f.getName()+" : "+f.length());//打印该对象名称及字节数(大小) } } public static void listDemo_2()//过滤流 { File dir = new File("f:\JAVA\test"); String[] arr = dir.list(new FilenameFilter(){//匿名内部类实现FilenameFilter接口 public boolean accept(File dir,String name) { return name.endsWith(".txt"); } }); sop("len: "+arr.length); for (String name: arr ) { sop(name); } } public static void listDemo_1() { File dir = new File("f:\JAVA\test");//该对象必须是存在的目录 String[] names = dir.list(); for (String name :names )//遍历列出该目录下所有文件和目录 { sop(name); } } public static void listRootsDemo()//根目录 { File[] files = File.listRoots();//列出文件系统根目录(盘符) for (File f : files )//增强for循环,遍历 { sop(f); } } public static void sop(Object obj) { System.out.println(obj); } }
递归
需求:
列出指定目录下文件或文件夹,及其子目录中内容
分析目录中还有目录。只需执行同一个列出目录功能的函数完成即可;在列出过程中判定出现的对象还是目录的话,就再次调用本功能
即函数自身调用自身,这种编程形式称为递归
递归示例:
public static int recursion_2(int n){//递归演示2求累加和 if(n==1) return 1; else return n+recursion_2(n-1); } public static void recursion(int num){//递归演示求二进制 if (num>0){ recursion(num/2); sop(num%2); } }
内存图解:传入一个值6来求其二进制表现
递归注意事项:
1,限定条件
2,要注意控制次数,避免内存溢出
递归获取目录下所有文件
import java.io.*; class FileDemo3 { public static void main(String[] args) { File dir = new File("f:\java\test"); showDir(dir); } public static void showDir(File dir) { sop(dir); File[] files = dir.listFiles();//返回dir对象下的File对象 for(int x=0; x<files.length; x++) { if(files[x].isDirectory()) showDir(files[x]); //如果是目录,递归 else sop(files[x]); //如果是文件,打印名称 } } public static void sop(Object obj){ System.out.println(obj); } }
删除一个带内容的目录
原理:在windows中删除目录是从里面往外删的,就需要用到递归
import java.io.*; class RemoveDir { public static void main(String[] args) { File dir = new File("G:\delete"); removeDir(dir); } public static void removeDir(File dir) { File[] files = dir.listFiles(); //获取该目录下所有文件对象 for (File f:files ) { if (!f.isHidden() && f.isDirectory())//非隐藏并且是目录 removeDir(f); else sop(f.toString()+" file "+f.delete());//删除文件 } sop(dir+" dir "+dir.delete()); //删除目录 } public static void sop(Object obj){ System.out.println(obj); } }
需求:文件列表
建立一个java文件列表文件,将制定目录下java文件的绝对路径,存储到一个文本文件中思路:
1,对指定目录进行递归
2,获取递归中java文件的路径
3,将这些路径存储到集合中
4,将集合中数据写入到列表文件中
操作:
import java.io.*; import java.util.*; //集合 class JavaFileList { public static void main(String[] args) throws IOException { File dir = new File("f:\java\test"); List<File> list = new ArrayList<File>(); fileToList(dir,list); // System.out.println(list.size()); File file = new File(dir,"javalist.txt"); writeToFile(list,file); //写入文本 } public static void fileToList(File dir,List<File> list) { File[] files = dir.listFiles();//获取File对象数组 for (File f : files ) { if(f.isDirectory()) fileToList(f,list); //如果是目录,递归 else if (f.getName().endsWith(".java")) list.add(f); //将满足条件的File对象存入list集合 } } public static void writeToFile(List<File> list,File file) { BufferedWriter bufw = null; try{ bufw = new BufferedWriter(new FileWriter(file));//FileWriter可以接收String,也可以接收File for (File f: list ) { String path = f.getAbsolutePath();//绝对路径 bufw.write(path); //写入 bufw.newLine(); bufw.flush(); } } catch (IOException e){ throw new RuntimeException(""); } finally{ try{ if(bufw!=null) bufw.close(); } catch (IOException e){ throw new RuntimeException(""); } } } }