day20(上)_IO流5(File方法)
1.File类概述:
/* File类概述: 1.用来将文件或者文件夹封装成对象 2.方便对文件与文件夹进行操作 3.File对象可以作为参数传递给流的构造函数 虽然流对象也能操作文件,但操作不了文件夹,也操作不了文件的属性信息(长度,修改时间..) 流只能操作数据. */
2.File类的构造函数:
/* File构造函数: ①File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 ②File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 如果parent为null,效果同① ③File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 如果parent为null,效果同① ②和③区别不大 */ package filedemo; import java.io.File; class FileDemo{ public static void sop(Object obj){ System.out.println(obj);//封装什么,打印什么,也就是String getpath()返回值} public static void main(String[] args){ sop(new File("a.txt")); //将a.txt封装成一个File实例,可以将已有的或未出现的文件夹封装成对象 sop(new File(".\\a.txt"));//这里使用了相对路径 sop(new File("d:\\","c.txt"));//将路径和文件名分别传入,这样做相对于单参传递有个优点 //当文件名为变量时,可以传入变量,也就是说同一目录下不同文件 File f1=new File("d:\\"); sop(new File(f1,"c.txt")); sop(File.separator);//与系统有关的默认分隔符 //widows为:"\\" //"\\",把\作为普通字符处理,该字符串只有一个字符为'\' sop(new File("k:"+File.separator+"aa"+File.separator+"mm.txt"));//为了实现跨平台 } }
3.Flie类的常用方法示例:
/* File类常见方法: 1.创建 public boolean createNewFile()throws IOException 在指定路径创建文件,如果文件已经存在,则不再创建,并且反回false 注意:区分操作文件的输出流对象(FileWriter/FileOutputStream) 一建立创建文件,如果文件已存在->覆盖原文件 File f=new File("11\\22\est.txt");sop("createF: "+f.createNewFile());//Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
//当文件所在目录并不存在时,会发出IOExcepiton
2.删除 public boolean delete() 删除此抽象路径名表示的文件或目录。 如果此路径名表示一个目录,则该目录必须为空(该目录下没有目录/文件)才能删除。 如果封装的多级目录:例如11//22//33 已创建->删除33,并不是删除整个目录 如果封装的是文件: 例如:11/abc.txt 已创建->删除abc.txt public void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录 根据 Java 语言规范中的定义,只有在虚拟机正常终止时,才会尝试执行删除操作。 3.判断 public int compareTo(File pathname)//该类实现了Comparable接口 按字母顺序(字典顺序)比较两个抽象路径名 public boolean canExecute() 测试应用程序 是否可以执行 此抽象路径名表示的文件。 不存在/不可执行,返回false ※public boolean exists() 测试此抽象路径名表示的 文件或目录是否存在。 判断的是你封装的文件对象的内容是否在硬盘上存在 public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 //以上两个方法均判断的是被封装的对象内容,并且已在硬盘上存在,不存在,返回false public boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 public boolean isAbsolute() 测试此抽象路径名是否为绝对路径名。 即使该路径在硬盘上并不存在,也可以判断 */
package filemethod; import java.io.File; import java.io.IOException; class FileMethodDemo{ public static void sop(Object obj){ System.out.println(obj); } public static void judge_1(){ sop("File2.txt是否可被应用程序执行:"+new File("File2.txt").canExecute());//该文件不存在 //false sop("3_FileMethodDemo.java是否可被应用程序执行:"+new File("3_FileMethodDemo.java").canExecute());//已存在,并且能被应用程序执行 //true sop("3_FileMethodDemo.java是否存在:"+new File("3_FileMethodDemo.java").exists()+"\n");//存在//true } public static void judge_2()throws IOException{ File f=new File("abc\\1234.txt"); f.createNewFile();//在判断文件对象是否是文件或目录时,必须要先判断该文件对象的内容是否存在if(f.exists()){ sop("isDir:"+f.isDirectory());//false sop("isFile:"+f.isFile()+"\n");//true } } public static void judge_3(){ File f=new File(".\\abc\\123.txt"); sop(".\\abc\\123.txt:"+f.isAbsolute());//false f=new File("c:\\dd\\qq\\1.txt"); sop("c:\\dd\\qq\\1.txt:"+f.isAbsolute());//true /* 绝对路径:是从盘符开始的路径 相对路径: 是从当前路径开始的路径 */ } public static void createDir(){ File dir=new File("abc"); sop("当前路径下创建一级目录abc:"+dir.mkdir());//创建一级目录,mkdir也是dos命令//true dir=new File("11\\22\\33"); sop("当前路径下创建多级目录:"+dir.mkdirs());//创建多级目录 //true sop("JVM读取到的当前路径:"+System.getProperty("user.dir")+"\n");//当前路径 /* JVM可以从系统属性中获取到user.dir */ /* 如果有多级目录,而调用了mkdir()->返回false,并不创建目录 */ } public static void createDel()throws IOException{ File fr=new File("File1.txt"); sop("当前路径下创建File1.txt文件:"+fr.createNewFile());//true sop("当前路径下再次创建File1.txt文件:"+fr.createNewFile());//false sop("删除File1.txt:"+fr.delete()+"\n");//true /* 有些操作完的文件想要删除掉, 如果在删除动作前面的代码发生异常导致删除执行不到 这时考虑把删除放在finally中,即使这样,还有可能无法删除 如果此时,该文件依然被流对象操作,那么无法删除(就好像,某个正在使用的文件,我们无法删除它) 考虑使用deleteOnExit() */ } public static void main(String[] args)throws IOException{ createDel(); judge_1(); judge_2(); judge_3(); createDir(); } } /* 关于创建小结: 创建文件时,文件所在的目录必须存在,不然发出IOException 可以创建没有扩展名的文件,但没实际意义 创建多级目录时,选用mkdirs()方法,如果选用mkdir,不会创建目录,并返回false */
/* 获取信息: public String getPath() 将此抽象路径名转换为一个路径名字符串。所得字符串使用默认名称分隔符分隔名称序列中的名称。 封装的什么路径,获取的就是什么路径 public String getAbsolutePath() 如果封装的为绝对路径,等同于getPath 否则user.dir与封装内容拼接 public String getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。 也就是最后一级的前面所有 public String getName() 返回的该名称 是路径名名称序列中的最后一个名称。 如果路径名名称序列为空,则返回空字符串。 public long length() 返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。 返回: 此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在,则返回 0L。 public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。 例如:当我操作过一次文件,把时间记录下来,别人也可能修改 下次用时,判断最后一次被修改时间,如果是我记录时间值, 表明在我之后没被修改,否则,被别人修改. public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。如果已经存在具有目标抽象路径名的文件, 那么该操作可能无法获得成功。 */package filedemo; import java.io.File; import java.io.IOException; class FileMethodDemo2{ public static void sop(Object obj){ System.out.println(obj); } public static void reName()throws IOException{ File f1=new File("d:\\abc.txt"); f1.createNewFile(); File f2=new File("f:\\mm.java"); sop("rename: "+f1.renameTo(f2));//会将d盘下创建的abc.txt->移动到f盘下 //并且重命名为mm.java //相当于windows的剪切+粘贴+重命名 /* 当abc.txt不存在或mm.java已存在 返回false */ } public static void getFileInfo(){ File f=new File("g:\\abcd\\efg\\a.txt"); sop("getPath(): "+f.getPath()); sop("getAbsPath(): "+f.getAbsolutePath());//相当于getPath() sop("getPar(): "+f.getParent()); sop("getName: "+f.getName()); sop("\n"); f=new File(".\\abc\\efg"); sop("getPath(): "+f.getPath()); sop("getAbsPath(): "+f.getAbsolutePath());//user.dir与封装的内容拼接 sop("getPar(): "+f.getParent());//返回的是最后一级目录的 前面的路径 sop("getName: "+f.getName()+"\n"); f=new File("1.txt");//该文件在硬盘上存在 //内容abc sop("getAbsolute: "+f.getAbsolutePath()); sop("lastM: "+f.lastModified());//最后一次修改时间与1970 年 1 月 1 日,00:00:00 GMT 毫秒时间差 sop("length(): "+f.length());//返回是文件内容在硬盘上所占的字节数 } public static void main(String[] args)throws IOException{ getFileInfo(); reName(); } }
4.File类的list的方法:
/* static File[] listRoots() 列出可用的文件系统根. 表示可用文件系统根的 File 对象数组,如果无法确定根集, 则返回 null。如果没有文件系统,那么该数组将为空。 也就是列出了计算机中所有盘符 public String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 每个字符串是一个文件名/目录名,而不是一条完整路径,注意区别listFiles方法 表示目录本身及其父目录的名称不包括在结果中。 如果目录为空,那么数组也将为空(length=0)。 如果此抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。 public File[] listFiles() 得到的每个抽象路径名都是根据此抽象路径名, 使用 File(File, String) 构造方法构造。 */
package filedemo; import java.io.File; import java.util.Arrays; import java.io.FileFilter; import java.io.FilenameFilter; class FileMethodDemo3{ static int[] arr={1,2,3}; public static void listRootsDemo(){ for(File file :File.listRoots()) System.out.println(file);//当需要确定写入的目的地时,需要获取盘符 } public static void listDemo(){ File f=new File("f:\\"); for(String str : f.list()) System.out.println(str);//列出所有文件/目录,包括隐藏的 f=new File("f:\\abc.txt"); for(String str : f.list()) System.out.println(str);//NullPointerException,f.list()返回null //这是因为在遍历过程中会使用到f.list().length //例如:int[] arr=null;arr.length;//将null作为一个数组,获得其长度,发出NullPointerException //如果该目录存在并且其下没有内容,返回一个length=0的String数组 } public static void main(String[] args){ listRootsDemo(); listDemo(); } }
5.过滤出指定的文件:
class FileFilterImp implements FileFilter{ //过滤出后缀名为java的文件public boolean accept(File pathname){ //pathname为f中的封装路径+该路径下的文件名String fileName=pathname.getName(); String[] fileSuff=fileName.split("\\."); return fileSuff[fileSuff.length-1].equals("java")); } } class FileFilterDemo{ public static void main(String[] args){ File f=new File("../");//当前目录的上一级目录 /* File[] listFiles(FileFilter filter) 返回抽象路径名数组, 这些路径名表示此 抽象路径名表示的目录中满足指定过滤器的文件和目录。 */ File[] path=f.listFiles(new FileFilterImp()); for(File file : path) System.out.println(file.getName()+" "+file.length()+"B"); /* public String[] list(FilenameFilter filter) 返回一个字符串数组, 这些字符串指定此抽象路径名(调用list的File对象中封装的内容)表示的目录中满足指定过滤器的文件和目录。 如果给定 filter 为 null,则接受所有名称。 */ String[] files=f.list(new FilenameFilter(){ //匿名内部类 public boolean accept(File dir,String name){ //dir:f中封装路径 ,name:f.list()中的文件return name.endsWith(".java");//用endWith方法 } }); for(String fileName : files) System.out.println(fileName); } }
listFiles(FileFilter)与list(FilenameFilter)底层:
/* //list源码: public String[] list(FilenameFilter filter) { String names[] = list(); if ((names == null) || (filter == null)) { return names; } List<String> v = new ArrayList<>(); for (int i = 0 ; i < names.length ; i++) { if (filter.accept(this, names[i])) {//由此可见this代表创建的File对象 v.add(names[i]); //dir指向了该File对象 } } return v.toArray(new String[v.size()]);//集合转换成String数组 } //listFiles源码 public File[] listFiles(FilenameFilter filter) { String ss[] = list(); if (ss == null) return null; ArrayList<File> files = new ArrayList<>(); for (String s : ss) if ((filter == null) || filter.accept(this, s)) files.add(new File(s, this));//File对象中封装了目录+文件 return files.toArray(new File[files.size()]); }public File[] listFiles(FileFilter filter) {
String ss[] = list();
if (ss == null)
return null;
ArrayList<File> files = new ArrayList<>();
for (String s : ss) {
File f = new File(s, this);
if ((filter == null) || filter.accept(f))
files.add(f);
}
return files.toArray(new File[files.size()]);
}*/ /* 实际开发用listFiles而不是list因为listFiles返回File[],那么每个文件对象 可使用File中方法,例如getName,length */