1、IO概念

File类是java.io包中一个很重要的类,这里的io,就是指 Input/Output,所以在看File类之前,先提一下所谓的IO概念。

I/O(Input/Output),即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出:
  • 如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据
  • 通过输入和输出操作可以从外界接收信息,或者把信息传递给外界

这里的输入还是输出,是针对内存来说的:
  • 把数据读入到内存中,为输入Input,进行数据的read操作
  • 把内存往外部设备写数据,称为输出Output,进行数据的write操作
在Java中,是把输入和输出操作用“流”来实现的,通过统一的接口来表示,这个在后面会讲到。
 

2、File类

程序中不可避免地会使用到IO方面的操作,Java中的java.io包中就是针对IO操作的类和接口,而File类则是之中很重要的一个类。

File类的对象可以表示(封装)一个文件,或者是目录。该对象可以对其表示的文件或目录的属性进行操作,如文件名修改,最后修改日期等等。

File对象无法操作文件的具体数据,即不能直接对文件进行读/写操作。


2.1 File类的构造方法


File类的构造方法有几种重载方式:
  • public File(String pathname)  根据路径得到File对象  
  • File file = new File("C:\\demo\\a.txt");

  • public File(String parent, String child)  根据一个目录和一个子文件/目录得到File对象
  • File file = new File("C:\\demo", "a.txt");

  • public File(File parent, String child)  根据一个父File对象和一个子文件/目录得到File对象
  • File baseFile = new File("C:\\demo");  File file = new File(baseFile, "a.txt");

路径的分隔符,要么使用 "/",要么使用 "\\",甚至可以用 File.Separater 来替代,如 File file = new File("c" + File.Separater + "test.txt");

以上三种方式的最终效果都是一样的,最常用的还是File(String pathname),指定路径创建文件对象。

要说明的是,这里只是创建一个跟指定文件关联的File对象,而不是创建了一个文件或目录。

2.2 File类的常用方法

返回值     方法名     说明
boolean     exists()     判断文件是否存在    
boolean     isFile()     判断是否为文件
boolean     isDirectory()     判断是否为目录
String     getName()     获取文件的名称    
String     getAbsolutePath() 获取文件的绝对路径    
long     length()     获取文件的大小长度(字节数)
boolean     createNewFile()     创建新文件,返回执行结果    
boolean     delete()     删除文件,返回执行结果
boolean canWrite() 是否可写
 

2.3 创建File

new获得到File对象,只是关联了文件的一个对象,而我们真正想要实现创建文件或目录的话,则要调用相应的方法。

2.3.1 创建目录

返回值     方法名     说明
boolean     mkdir() 根据File对象创建一个目录
boolean     mkdirs() 根据File对象创建整个目录
mkdir()和mkdirs()的区别在于,假如有 File file = new File("D:/abc/xyz/hello"); 
  • mkdir()创建目录,必须上一级目录存在。如例若D盘下abc目录存在,但xyz目录不存在,则不能成功创建hello目录
  • mkdirs()创建File对象包含的整个目录,不论路径中某个目录实际是否存在,不存在则创建

注意和创建文件区别,假如有 File file = new File("C:/test/test.txt"); 如果使用的是mkdirs(),则最终会创建一个名为 "test.txt" 的文件夹,而不是创建出 test.txt 的文本文件

2.3.2 创建文件 (New / Temp)

返回值     方法名     说明
boolean     createNewFile() 创建新的文件    
boolean     File.createTempFile()     创建新的临时文件
  • createNewFile()  根据路径创建空文件,当路径不存在,或文件已存在则创建失败(这意味着最好先调用exists方法判断)
  • File.createTempFile()  根据路径创建临时文件,可指定文件名前后缀以及文件目录,若不指定目录则放在系统临时文件夹下

后者 File.createTempFile() 创建临时文件,是File类的一个静态方法,同样,该方法也要求首先路径存在,不会自动创建目录。其方法有两种重载方式:
  • createTempFile(String prefix, String suffix)
  • createTempFile(String prefix, String suffix, File directory)

其中prefix是文件名的前缀;suffix是文件的后缀,如果suffix不是“点和文件类型”的形式,例如 ".txt",则suffix作为文件名末尾,否则作为文件类型:

之前对createTempFile()的用途不是很理解,以为该文件在创建完一定时间后会自动清理,所以称之为临时文件,实际上不是的。存在还是会一直存在,其临时文件的主要含义在于其文件名,上图例中可以看到,文件名是自定义的前后缀加中间的一串数字,构成了一个文件名唯一的文件。

也即是说,File.createTempFile 的用途是当你想要建立一个文件暂时使用,但是你不在乎其精确的文件名,只要不覆盖已存在的文件时即可。你可以指定临时文件的前缀(不得太短,不得为null),以及文件的后缀(可以为null,则默认后缀为 .tmp)和文件所在目录,如果不指定目录,则存放在系统的临时文件夹下。

2.4 删除文件 (delete / deleteOnExit)

删除文件的方法为 delete(),返回值类型为boolean,该删除文件不会放入回收站中,而是直接删除。

File file = new File("C:/test/test.txt");
if(file.exists()){
file.delete();
}
4
 
1
File file = new File("C:/test/test.txt"); 
2
if(file.exists()){
3
    file.delete();
4
}

还有一个方法很类似,叫做 deleteOnExit(),注意不是 deleteOnExists(),所以这个方法并不是所谓的判断文件如果存在再删除。那么什么叫做退出时删除呢?

deleteOnExit 的解释为,当虚拟机终止时,请求删除此抽象路径名表示的文件或目录。也就是说,deleteOnExit成功运行后,文件并没有直接删除,而是在虚拟机运行结束后才会删除。

这个方法实际上和上面提到的 createTempFile 是对应的,也即使说,这个方法通常是用在临时文件的删除。场景如:程序有个需求需要创建临时文件,这个临时文件可能作为存储使用,但是程序运行结束后,这个文件应该就被删除了。在哪里做删除操作呢,需要监控程序关闭吗?如果很多东西可以终止程序,那么这个删除操作需要都放置一份吗?其实就这么写,程序结束后文件就会被自动删除了:

File file = File.createTempFile("tmp", null);
file.deleteOnExit();
2
 
1
File file = File.createTempFile("tmp", null);
2
file.deleteOnExit();

也可以这样写,然后在最后的println处打断点进行测试:

public static void main(String[] args) throws IOException {
File directory = new File("C:/test");
File temp = File.createTempFile("temp", null, directory); temp.deleteOnExit(); System.out.println("deleteOnExit()已经执行!");
System.out.println("real end"); //此处打断点暂停,发现文件尚未删除
}
9
 
1
public static void main(String[] args) throws IOException {
2
    File directory = new File("C:/test");
3
    File temp = File.createTempFile("temp", null, directory);
4

5
    temp.deleteOnExit();
6

7
    System.out.println("deleteOnExit()已经执行!");
8
    System.out.println("real end"); //此处打断点暂停,发现文件尚未删除
9
}


3、File类的遍历

3.1 遍历

File类中有 list() 和 listFiles() 方法
返回值     方法名     说明
String[] list()     将目录下的子目录及文件的名字,返回到String数组中    
File[]     listFiles()     将目录下的子目录及文件的实例返回到File数组中
注:这里返回的文件名称包含文件类型的后缀

3.2 过滤

为了根据某些条件获取我们想要的结果集,Java提供了两个过滤器接口,作用如其名:FilenameFilter 和 FileFilter

然后我们就可以使用重载的list方法,以过滤器作为参数传入来进行结果过滤
  • list ( FilenameFilter filter )
  • listFiles ( FileFilter filter )
  • listFiles ( FilenameFilter filter )
 
当然,这两个接口的实现类,要求实现accept方法,以自定义过滤规则,符合条件规则的返回true:
  • FilenameFilter 要求实现 boolean accept ( File dir, String name )
  • dir:表示文件的当前目录
  • name:表示当前目录的子目录或文件的名字

  • FileFilter 要求实现 boolean accept ( File pathName)
  • pathName:表示当前目录的子目录或文件的名字

如筛选 .java 类型的文件:

public class MyFilenameFilter implements FilenameFilter {

    public boolean accept(File dir, String name) {
if (name.endsWith(".java")) {
return true;
} else {
return false;
}
}
}
10
 
1
public class MyFilenameFilter implements FilenameFilter {
2

3
    public boolean accept(File dir, String name) {
4
        if (name.endsWith(".java")) {
5
            return true;
6
        } else {
7
            return false;
8
        }
9
    }
10
}
public static void main(String[] args) throws IOException {
File directory = new File("C:/test"); String[] dirs = directory.list(new MyFilenameFilter());
for (String dir : dirs) {
System.out.println(dir);
}
}
8
 
1
public static void main(String[] args) throws IOException {
2
    File directory = new File("C:/test");
3

4
    String[] dirs = directory.list(new MyFilenameFilter());
5
    for (String dir : dirs) {
6
        System.out.println(dir);
7
    }
8
}

如筛选文件类型的File对象,去掉目录类型:

public class MyFileFilter implements FileFilter{

    public boolean accept(File pathname) {
if (pathname.isFile()) {
return true;
} else {
return false;
}
}
}
10
 
1
public class MyFileFilter implements FileFilter{
2

3
    public boolean accept(File pathname) {
4
        if (pathname.isFile()) {
5
            return true;
6
        } else {
7
            return false;
8
        }
9
    }
10
}
public static void main(String[] args) throws IOException {
File directory = new File("C:/test"); File[] files = directory.listFiles(new MyFileFilter());
for (File file : files) {
System.out.println(file.getName());
}
}
x
 
1
public static void main(String[] args) throws IOException {
2
    File directory = new File("C:/test");
3

4
    File[] files = directory.listFiles(new MyFileFilter());
5
    for (File file : files) {
6
        System.out.println(file.getName());
7
    }
8
}


4、总结

  • File对象封装了一个文件/目录,不能操作文件内容
  • 通过File对象可以创建或删除文件/目录,留意createTempFile和deleteOnExit
  • File对象的遍历可以通过过滤器进行筛选


5、其他知识点延伸

5.1 FileCopyUtils.copy()

org.springframework.util 包中有个FileCopyUtils类(更多参考API),该类提供了许多一步式的静态操作方法,能够将文件内容拷贝到另一个目标,这个目标可以是byte[],String,甚至一个输出流或者另外输出到一个文件中。

这里主要叙述一下文件内容的拷贝方法说明,更多的也可以参考链接《Spring优秀工具类Resource

 

[01] File类的更多相关文章

  1. JavaIO(01)File类详解

    File类 file类中的主要方法和变量   常量: 表示路径的分割符:(windows) 作用:根据java可移植性的特点,编写路径一定要符合本地操作系统要求的分割符: public static ...

  2. 01.使用File类读写文件

    使用File类去读数据: 方法一:使用ReadAllBytes(); 方法 namespace _01.使用File类读写数据01 { class Program { static void Main ...

  3. 01 IO流(一)—— 流的概念、File类

    1 流的概念理解(重要) 理解流的概念非常重要. 流,就是程序到数据源或目的地的一个通道. 我们把这个通道实例化得到一个具体的流,相当于一个数据传输工具,它可以在程序与资源之间进行数据交换. 换言之, ...

  4. 01 语言基础+高级:1-8 File类与IO流_day08【 File类、递归】

    day08[File类.递归] 主要内容 File类 递归 教学目标 能够说出File对象的创建方式 能够说出File类获取名称的方法名称 能够说出File类获取绝对路径的方法名称 能够说出File类 ...

  5. 01背包(类) UVA 10564 Paths through the Hourglass

    题目传送门 /* 01背包(类):dp[i][j][k] 表示从(i, j)出发的和为k的方案数,那么cnt = sum (dp[1][i][s]) 状态转移方程:dp[i][j][k] = dp[i ...

  6. Java IO_001.File类--文件或文件夹相关操作

    Java IO之File对象常用操作 File类:用于文件或文件夹或网址相关联的操作.可以关联或不关联文件(即关联不存在的文件).构造函数有: public File(String pathname) ...

  7. File类常用方法和枚举

    新建一个file对象: File f = new File("F:\\01.JAVA基础300集\\05_常用类\\122.File类的使用.mp4"); (文件路径也可以用&qu ...

  8. Java 基础(三)| IO流之使用 File 类的正确姿势

    为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是 File 类? java ...

  9. File类的特点?如何创建File类对象?Java中如何操作文件内容,什么是Io流Io流如何读取和写入文件?字节缓冲流使用原则?

    重难点提示 学习目标 1.能够了解File类的特点(存在的意义,构造方法,常见方法) 2.能够了解什么是IO流以及分类(IO流的概述以及分类) 3.能够掌握字节输出流的使用(继承体系结构介绍以及常见的 ...

随机推荐

  1. JS模拟类的实现

    http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html

  2. 设计模式(8)--Decorator--装饰器模式--结构型

    1.模式定义: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.模式特点:    装饰模式能够实现动态的为对象添加功能,是从一个对象 ...

  3. php Yii2使用registerJs或registerCss报错syntax error, unexpected end of file

    解决方法: 注册时$js=<<<JS .....JS;//结尾处JS;应单独成行并且没有空格  JS;//这样就会报错,多了空格JS;//这样就不会

  4. SourceTree 简单使用 for Mac

    系统版本: 10.12.6 SourceTree版本:2.3.1 (中文版)SourceThree安装包 密码:9jc3 传送门 目录 1.创建gitHub账号和仓库 2.sourceTree管理gi ...

  5. Android ViewPager无法使用wrap_content属性自适应高度

    使用ViewPager的时候发现一个问题,当设置ViewPager控件的height属性为wrap_content时,控件高度一直是0,无法正常显示,在网上找到了解决办法,重写ViewPager的on ...

  6. SpringMVC获取页面数据乱码的解决get/post

    一.post请求方式的乱码 在web.xml中加入: <filter> <filter-name>CharacterEncodingFilter</filter-name ...

  7. 数据结构之合并链表STL

    #include <iostream> #include <list> using namespace std; int main() { int n, m; while (c ...

  8. java代码块的理解

    最近在复习java基础,在看到java代码块的时候,忽然发现自己貌似对于java代码块一无所知,于是赶紧对着一些资料实战演练了一把. 对于java代码块,不难根据名称看出其实就是一些java语句的集合 ...

  9. Asp.net mvc3的“从客户端中检测到有潜在危险的 Request.Form 值”问题解决

    Asp.net mvc3的“从客户端(content_v=\",<p>\n\t<imgalt=\"\" src...\")中检测到有潜在危险的 ...

  10. 如何将ASP.NET-WebApi发布到IIS6.0上(转)

    关于"如何将ASP.NET-WebApi发布到IIS6.0上"的这方面的学习,一开始项目组长让我们接触的时候,我的心情是这样的 哇呜.jpg 当时真的是一脸懵逼啊,对于刚接触asp ...