这个类可以将文件或文件夹封装成对象,可以对文件与文件的属性信息进行操作
因为流只能操作数据,所以需要借用File类来操作文件信息
1.File(String pathName)和File(String parent,String child):
(1).在第二个构造方法中parent可是固定值,而child可以是变量
例:
public static void main(String[] args) throws Exception
{
String fileName = "demo2.txt";
File file = new File("demo.txt");
File file1 = new File("file","demo1.txt");
File file2 = new File("file",fileName);
file.createNewFile();
file1.createNewFile();
file2.createNewFile();
}
(2).pathName要么是绝对路径,要么是相对路径(相对于当前运行文件的目录下,不能是直接指明该目录,如:editplus\\demo.txt,editplus是工作目录)
public static void main(String[] args) throws Exception
{
//工作环境是EditPlus3,所以要么是D:\\works\\Workspaces\\EditPlus3\\demo.txt
//要么是demo.txt,而不能是EditPlus3\\demo.txt
File file = new File("demo.txt");
File file1 = new File("D:\\works\\Workspaces\\EditPlus3\\demo1.txt");
//不能如下面,这样的话默认认为是在EditPlus3下再创建一个EditPlus3文件夹,而此时在EditPlus3下没有创建EditPlus3文件夹,所以会出错
File file2 = new File("EditPlus3\\demo2.txt");
file.createNewFile();
file1.createNewFile();
//这里没有调用mkdir(),所以会出错
file2.createNewFile();
}
工作环境:
由上面的例子要明白,分清文件目录和文件
(3)解决方法:public static void main(String[] args) throws Exception { //工作环境是EditPlus3,所以要么是D:\\works\\Workspaces\\EditPlus3\\demo.txt //要么是demo.txt,而不能是EditPlus3\\demo.txt File file = new File("demo.txt"); File file1 = new File("D:\\works\\Workspaces\\EditPlus3\\demo1.txt"); //不能如下面,这样的话默认认为是在EditPlus3下再创建一个EditPlus3文件夹 File file2 = new File("EditPlus3\\demo2.txt"); file.createNewFile(); file1.createNewFile(); //获取父目录,并创建文件目录 file2.getParentFile().mkdir(); //创建文件 file2.createNewFile(); }
2.创建(1)boolean createNewFile()方法这个方法用来创建一个文件,如果要创建的文件已存在,则不创建返回false,否则返回true,表示可以创建例:public static void main(String[] args) throws Exception { File file = new File("demo.txt"); boolean flag = file.createNewFile(); System.out.println(flag); }
不存在要创建的文件demo.txt时:
已存在要创建的文件时,不会重新创建一个文件来覆盖原有的文集那(而IO流操作却会重新创建一个同名文件将原来的文件覆盖掉)
(2)static File createTempFile(String prefix,String suffix)方法和static File createTempFile(String prefix,String suffix,File directory)方法1).createTempFile(String prefix,String suffix)方法用来创建一个临时文件,并返回File对象,使用的目录是系统默认的临时文件目录例:public static void main(String[] args) throws Exception { File file = File.createTempFile("demo",".tmp"); System.out.println(file.getPath()); }
可以看到默认的临时文件目录
2).createTempFile(String prefix,String suffix,File directory)使用指定的目录,创建一个临时文件例:public static void main(String[] args) throws Exception { File directory = new File("TMP"); //必须要先创建目录 directory.mkdir(); File file = File.createTempFile("demo",".tmp",directory); System.out.println(file.getPath()); }
(3)mkdir()和mkdirs()方法1).mkdir()方法是只能创建一级目录,不能创建多级目录例:public static void main(String[] args) throws Exception { //这里使用的是一级目录 File file = new File("file","demo.txt"); file.getParentFile().mkdir(); file.createNewFile(); }
2).mkdirs()方法是能够创建多级目录例:public static void main(String[] args) throws Exception { //这里使用的是一级目录 File file = new File("file\\file1\\file2\\file3","demo.txt"); file.getParentFile().mkdirs(); file.createNewFile(); }
3.判断(1).exists()方法:这个方法用于判断文件或目录是否存在例:public static void main(String[] args) throws Exception { File file = new File("file"); //判断目录是否存在 System.out.println(file.exists()); //判断文件是否存在,其实demo.txt可以是文件,也可以是目录, File file1 = new File("demo.txt"); System.out.println(file1.exists()); }
(2).isDirectory()方法:这个方法判断创建的是不是目录例:public static void main(String[] args) throws Exception { File file = new File("file"); //判断是不是目录 System.out.println(file.isDirectory()); //其实demo.txt可以是文件,也可以是目录, File file1 = new File("demo.txt"); System.out.println(file1.isDirectory()); }
(3).isFile()方法这个方法判断是不是文件例:public static void main(String[] args) throws Exception { File file = new File("file"); //判断目录是否存在 System.out.println(file.isFile()); //判断文件是否存在,其实demo.txt可以是文件,也可以是目录, File file1 = new File("demo.txt"); System.out.println(file1.isFile()); }
4.删除(1)boolean delete()方法例:public static void main(String[] args) throws Exception { File file = new File("demo.txt"); file.delete(); }
(2)void deleteOnExit()方法这个方法表示在程序退出时,删除创建的文件,因为有可能在程序出现异常时,有些要删除的文件不能被删除,所以使用这个方法例:使用delete时,出现异常public static void main(String[] args) throws Exception { File file = new File("demo.txt"); try{ int i = 7/0;//在delete前出现异常,导致下面文件不能被删除 file.delete(); }catch(Exception e){ } }
测试是不是在退出后才删除文件:
class MyRunnable implements Runnable{ public void run(){ int i=0; try{ while(true){ Thread.sleep(1000); if(i++==10){ break; } System.out.println(i); } }catch(Exception e){} } } class TestFile { public static void main(String[] args) throws Exception { File file = new File("demo.txt"); file.deleteOnExit(); MyRunnable r = new MyRunnable(); Thread t = new Thread(r); t.start(); } }
5.获取信息
(1)File getParentFile()方法这个方法用来获取指定文件的上级目录,上级的目录必须要明确的指出,否则返回Null,如在构造方法中:例:public static void main(String[] args) throws Exception { //这里明确指出了父目录d File file = new File("d\\d.txt"); System.out.println(file.getParentFile()); }
(2)String getParent()方法这个方法获得父目录名public static void main(String[] args) throws Exception { //这里明确指出了父目录d File file = new File("d\\d.txt"); System.out.println(file.getParent()); }
(3)getPath()和getName()方法getPath()获得的是文件的路径,这个路径是指在构造方法是传递进来的路径,而不是文件本身在电脑中的物理路径,getPath()不管文件存不存在,返回的都是构造方法中传入的文件路径例:public static void main(String[] args) throws Exception { //此时的是不存在的,但getPath获得的就是这个传入进去的path:\demo.txt File file = new File("\\demo.txt"); System.out.println(file.getPath()); }
getName()方法获得的不是物理路径下的文件名,而是在构造方法传递进去的文件名例:public static void main(String[] args) throws Exception { //这里的demo.txt在\\下是没有的,但getName()获取的就是demo.txt File file = new File("\\demo.txt"); System.out.println(file.getName()); }
所以getName()和getPath()两个方法获得的不是物理路径下的,而是获得的是内存中的文件
6.列举信息:File类中的list*()方法列举信息,必须是目录才可以列举下面的信息,而如果构造方法传递的是文件,则不能调用list*()方法,将返回null例:public static void main(String[] args) throws Exception { File file = new File("sd\\Noname6.txt"); System.out.println(file.listFiles()); //delete(file); }
(1)static File[] listRoots()列举系统的根目录,即盘符例:public static void main(String[] args) throws Exception { for(File f:File.listRoots()){ System.out.println(f.getPath()); } }
(2)String[] list()方法和File[] listFiles()方法1).list() 这个方法将指定的目录下的第一个子级下的所有文件及文件夹都列出来例:public static void main(String[] args) throws Exception { File file = new File("D:\\works\\Workspaces\\EditPlus3"); for(String str:file.list()){ System.out.println(str); } }
2).listFiles() 这个方法将列举出的文件及文件夹封装成File对象后再返回例:public static void main(String[] args) throws Exception { File file = new File("D:\\works\\Workspaces\\EditPlus3"); for(File f:file.listFiles()){ System.out.println(f.getPath()); } }
(3).String[] list(FilenameFilter filter)和File[] listFile(FilenameFilter filter)方法在这两个方法中有FilenameFilter这个接口,实现此接口的类实例可用于过滤File
类的list
方法中的清单。,在这个接口中有一个方法accept()方法,用于对指定的文件进行过滤参数解析:File dir:表示的是在创建File时的目录String name:表示要过滤的名称,这里可以使用正则表达式过来返回值解析:符合条件返回true,表示可以获得该文件,否则返回false,表示淘汰该文件例:class TestFile implements FilenameFilterclass TestFile implements FilenameFilter { public static void main(String[] args) throws Exception { File file = new File("D:\\works\\Workspaces\\EditPlus3"); TestFile t = new TestFile(); for(String str : file.list(t)){ System.out.println(str); } } //该方法在File类中的list(FilenameFilter filter)方法中调用了 //这里也可以使用匿名类的方法 public boolean accept(File dir,String name){ if(name.endsWith(".txt")){ return true; }else{ return false; } } }
上面File类中的 list(FilenameFilter filter)方法的解析:File类中 list(FilenameFilter filter)的源码: 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])) { v.add(names[i]); } } return v.toArray(new String[v.size()]); }