19. Java学习之IO学习-----工具File类(JDK1.7之前使用)(java.io.File)

        JDK1.7之前用的是java.io.File,File是一个实用类库工具,它可以帮助我们处理文件目录问题。它可以将一个实际磁盘文件或目录对应到一个Java对象。Java中使用File来抽象一个文件,无论是普通文件或是目录,都可以对应一个File对象。它只是抽象的代表了磁盘上的某个文件或目录,内部实际上是依赖一个平台无关的本地文件系统类,并且 File 无法对其所表示文件内容进行任何读写操作(那是流做的事情)。(来自:https://www.jb51.net/article/143042.htm)。File类用于文件和目录的创建、文件的查找和删除,不能读写文件。(note:jdk1.7之后,sun公司引入了很多新的类来代替java.io.File类,比如Files和Path)

一. File对象的创建

    查看File类的源码发现共有6个构造函数,具体代码如下:

 1 private File(String pathname, int prefixLength)
 2   
 3 private File(String child, File parent) 
 4 
 5 public File(String pathname)  //文件的绝对路径
 6 
 7 public File(String parent, String child)  //指定父文件绝对路径、子文件绝对路径
 8 
 9 public File(File parent, String child)   //指定父文件、子文件相对路径
10 
11 public File(URI uri)  //文件的URI地址
View Code

    说明:File类共有6个构造函数,其中有两个private类型的,外部不能调用。另外四个是public类型的。

    用法举例:假设本地桌面上有一个目录test,该目录中有两个子目录a和b,然后还有两个文件c.txt和d.txt。

 1 package com.test.a;
 2 
 3 import java.io.File;
 4 
 5 public class Test {
 6     public static void main(String args[]) {
 7         String dirname = "C:\\Users\\hermioner\\Desktop\\test";
 8         String dirname2 = "C:/Users/hermioner/Desktop/test";
 9         String dirname3 = "C:\\Users\\hermioner\\Desktop";
10         // 1.File(String pathname)
11         File f1 = new File(dirname);// dirname和dirname2效果一样
12         // 2.File(File parent,String child)
13         File f2 = new File(dirname3);
14         File f3 = new File(f2, "test");
15         // 3.File(String parent,String child)
16         File f4 = new File(dirname3, "test");
17         // 4.File(URI uri)
18         // 比如:URI uri = new URI("http://mms.tom.com/image_128x128/36095.gif"); File file
19         // = new File(uri);
20         if (f4.isDirectory()) {//采用1,3,4测试都能成功
21             System.out.println("Directory of" + dirname);
22             String s[] = f4.list();
23             for (int i = 0; i < s.length; i++) {
24                 File file = new File(dirname + "\\" + s[i]);
25                 if (file.isDirectory()) {
26                     System.out.println(s[i] + " is a directory");
27                 } else {
28                     System.out.println(s[i] + " is a file");
29                 }
30             }
31         } else {
32             System.out.println(dirname + " is not a directory");
33 
34         }
35     }
36 }
37 
38 
39 Directory ofC:\Users\hermioner\Desktop\test
40 a is a directory
41 b is a directory
42 c.txt is a file
43 d.txt is a file
View Code

    note:新建文件的时候要注意一点,’\’在Java中是转义字符在Java中遇到’\’要使用’\\’或者’/’来代替,因此可以使用下面两种方式来新建一个文件。如果传入的pathname的值为null则回抛出空指针异常。

二. File类中常用方法介绍

 1. isFile和isDirectory方法上面例子中已经用到了,前者判断是是文件,后者判断是否是目录。

 2. boolean createNewFile()

     说明:如果文件或者目录存在,则返回false,否则就新创建。

1 public static void main(String args[]) throws IOException {
2         String dirname = "C:\\Users\\heriominer\\Desktop\\test\\cc";
3         File file=new File(dirname);
4         System.out.println(file.createNewFile());
5     }
View Code

     note:File()方法只是将磁盘中的某个已存在的文件导入到Java应用中,而creatNewFile()则是在磁盘中创建一个新文件。

3. boolean delete()

     说明:删除文件或者目录

 1 public class Test {
 2     public static void main(String args[]) throws IOException {
 3         String dirname = "C:\\Users\\hermioner\\Desktop\\test\\cc";
 4         File file=new File(dirname);
 5         System.out.println(file.delete());
 6     }
 7 }
 8 
 9 
10 输出是true,且桌面上的cc也被删除了
View Code

4. boolean mkdir()

     说明:它用于创建目录,要注意的是mkdir()只在给定的目录下创建子目录,如果给定的目录并不存在那么就会创建失败。

1 String dirname = "C:\\Users\\heriominer\\Desktop\\test\\subtest";
2 File file=new File(dirname);
3 System.out.println(file.mkdir());
View Code

5. boolean mkdirs()

     说明:与mkdir()方法不同,mkdirs()如果给定路径中的目录不存在则将路径中的所有目录一起创建,创建成功返回true否则返回false。

1 String dirname = "C:\\Users\\hermioner\\Desktop\\test\\subtest\\suubtest\\suuubtest";
2 File file=new File(dirname);
3 System.out.println(file.mkdirs());
View Code

6. long length()

     说明:返回由此抽象路径名表示的文件的长度。

7. File[] listFiles()  &  String[] list()

    说明:listFiles返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。list返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。

 1 public class Test {
 2     public static void main(String args[]) throws IOException {
 3         String dirname = "C:\\Users\\hermioner\\Desktop\\test";
 4         File file=new File(dirname);
 5         String list[]=file.list();
 6         System.out.println(Arrays.toString(list));
 7         File files[]=file.listFiles();
 8         System.out.println(Arrays.toString(files));
 9     }
10 }
11 
12 
13 [a, b, c.txt, d.txt]
14 [C:\Users\hermioner\Desktop\test\a, C:\Users\hermioner\Desktop\test\b, C:\Users\hermioner\Desktop\test\c.txt, C:\Users\hermioner\Desktop\test\d.txt]
View Code

  上面例子假设文件夹test下面有两个文件夹a和b,还有两个文件c.txt,d.txt。a中还有个子目录a2。

 9. boolean exists()

    说明:用于判断文件是否存在如果存在则返回true反之返回false。

1 String dirname = "C:\\Users\\heriominer\\Desktop\\test";
2 File file=new File(dirname);
3 System.out.println(file.exists());
View Code

三. 应用

1. 遍历目录及文件

     假设有如下目录结果需要进行遍历,可以有这些方法采用:

 

(1)方法一:回溯法

 1 package com.test.a;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 
 6 public class Test {
 7     public static void main(String args[]) throws IOException {
 8         String dirname = "C:\\Users\\hermioner\\Desktop\\test";
 9         File file = new File(dirname);
10         traverse(file);
11 
12     }
13 
14     private static void traverse(File file) {
15         File files[] = file.listFiles();
16         if (files == null || files.length == 0) {
17             return;
18         }
19         for (File f : files) {
20             if (f.isDirectory()) {
21                 System.out.println("Directory is " + f.getName());
22                 traverse(f);//递归调用
23             } else {
24                 System.out.println("File is " + f.getName());
25             }
26         }
27     }
28 }
29 
30 
31 Directory is a
32 Directory is a2
33 File is a3.txt
34 File is a4.txt.txt
35 Directory is b
36 File is b2.txt
37 Directory is e
38 File is c.txt
39 File is d.txt
View Code

说明:上面在目录中进行了递归调用,因为还可能在当前目录下存在子目录。

(2)其它方法:根据上面的图形,可以看成树,因此还可以使用深度优先,广度优先遍历等方法。后面尝试补充。

 比如广度优先遍历:

 1 package com.test.a;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.util.LinkedList;
 6 import java.util.Queue;
 7 
 8 public class Test {
 9     public static void main(String args[]) throws IOException {
10         String dirname = "C:\\Users\\hermioner\\Desktop\\test";
11         File file = new File(dirname);
12         BFS(file);
13 
14     }
15 
16     // 广度优先遍历,使用队列
17     private static void BFS(File file) {
18 
19         Queue<File> queue = new LinkedList<File>();
20         if (file != null) {
21             queue.add(file);
22         }
23 
24         while (!queue.isEmpty()) {
25             // 输出文件名或者目录名
26             System.out.println(queue.peek().getName());
27             File[] flist = queue.poll().listFiles();
28             if (flist == null || flist.length == 0) {
29                 continue;
30             }
31             // 将目录下的一层全部加入队列
32             for (File f : flist) {
33                 queue.add(f);
34             }
35         }
36 
37     }
38 }
39 
40 test
41 a
42 b
43 c.txt
44 d.txt
45 a2
46 b2.txt
47 e
48 a3.txt
49 a4.txt.txt
View Code

 

总结:关于File暂且学这么些,总结成如下方法(引用了http://www.cnblogs.com/dshore123/p/9214032.html部分内容),后面会补充JDK1.7之后代替java.io.File类的这些类。

创建:
   createNewFile():在指定位置创建空文件,成功返回true,如果已存在就不再创建了返回false
   mkdir():在指定位置创建目录,这之后创建最后一级目录,如果上级目录不存在就抛出异常.
   mkdirs():在指定位置创建目录,这也会创建路径中所有不存在的父目录
   renameTo(File dest):重命名文件或文件夹。文件不同时,相当于文件的剪切,剪切的时候不能操作非空文件夹。移动/重命名成功返回true,失败返回false
  
删除:
   delete() :删除一个文件或者空文件夹,如果文件夹不为空,则不能删除,成返回true,失败返回false
   deleteOnExit(): 在虚拟机终止时,请求删除此抽象路径名的文件或者目录,保证文件异常时也可以删除文件
 
判断:
   exists():判断指定的文件或者文件夹是否存在
   isFile():判断是否是一个文件;如果不存在,则为false
   isDirectory():判断是否是一个文件夹
   isHidden():判断指定的文件是否是隐藏文件
   isAbsolute():判断指定的文件或文件夹是否是在绝对路径下
 
获取:
  getName():获取文件或文件夹名称
  getPath():返回的是绝对路径,可以是相对路径,但是目录要指定
  getAbsolutePath():获取绝对路径
  length():获取文件的大小(字节为单位)
  getParent():获取文件的父路径
  lastModified():获取文件最后一次修改的时间

posted @ 2018-10-09 21:26  Hermioner  阅读(146)  评论(0编辑  收藏  举报