【Java IO流】File类的使用
File类的使用
Java中的File类是在java.io.File中,Java.IO.File类表示文件或目录。
File类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问。
一、File类的常用API介绍
首先在我的d盘下创建一个测试用的文件夹和文本文件,如下图所示:

1.创建File对象
我们创建一个File对象来获取测试用的目录,创建File对象最常用的就是通过文件的路径来创建,即File(String 路径),对于同一个路径有 以下三种方式:
/*
* File(String 路径)
*/
File file1=new File("D:\\code");//用双斜杠进行转义
File file2=new File("D:/code");//用反斜杠
File file3=new File("D:"+File.separator+"code");//File.separator File的静态成员,设置分隔符
也可以通过File(父目录,子目录)来创建,如:
File file=new File("D:/code","new4");//通过父目录来创建子目录
等价于
File file=new File("D:/code/new4");
2. exists() 判断文件或目录是否存在
在上述代码下添加如下代码,来看看这个目录是否存在:
System.out.println(file1.exists());
System.out.println(file2.exists());
System.out.println(file3.exists());
运行结果:

3.mkdir()和mkdirs() 创建目录或多级目录
现在我想在刚刚那个目录下再创建一个新的子目录,这时就可以通过mkdir()方法,具体操作如下:
File file4=new File("D:/code/new1");
if(!file4.exists()){
file4.mkdir();//也可以用mkdirs()
}
运行一下,查看一下刚刚的目录,发现成功创建了一个新的目录:

那么我想创建多级目录呢?可以通过mkdirs()方法来完成。
File file5=new File("D:/code/new2/new3");//创建多级目录
if(!file5.exists()){
file5.mkdirs();//注意这里不能用mkdir(),只能用mkdirs()
}
运行之后,查看一下刚刚的目录,发现成功创建了多级目录:

4.isDirectory()和isFile() 判断是否是目录或者是否是文件
System.out.println("file5是否为目录:"+file5.isDirectory());
System.out.println("fil5是否为文件:"+file5.isFile());
file5.delete();//删除目录
System.out.println("删除file5后是否为目录:"+file5.isDirectory());
File file6=new File("D:/code/hysum.txt");//创建文件
System.out.println("file6是否为目录:"+file6.isDirectory());
System.out.println("file6是否为文件:"+file6.isFile());
file6.delete();//删除文件
System.out.println("删除file6后是否为文件:"+file5.isFile());
运行结果:

结果分析:
isDirectory()和isFile()方法只有当此目录或文件存在且类型匹配的情况下才返回true,不符合两个条件的均返回false!
5.delete() 删除文件或目录
6.createNewFile() 创建新文件
在上面的例子里我删除掉了hysum.txt文件,这里我要通过createNewFile()方法来创建该文件。
if(!file6.exists()){
try {
file6.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
运行完毕之后,查看目录,发现文件创建成功:

注意:createNewFile()会抛出IOException的异常,可以用try-catch语句捕获或者抛出该异常!
上述的方法都是最简单的,接下来我们看一下常用的File获取get方法。
1.getAbsolutePath() 获取绝对路径。
2.getName() 获取文件名称,即当前目录。
3.getParent() 获取父级路径(创建时的父路径)。
4.getPath()获取构造file时候的路径。
我们来通过代码看一下上述方法的使用效果;
File file=new File(".","new4");//.代表当前路径,使用相对路径来创建目录
if(!file.exists()){
file.mkdir();
System.out.println("getName()获取文件或目录名称:"+file.getName());
System.out.println("getAbsolutePath()获取绝对路径:"+file.getAbsolutePath());
System.out.println("getParent()获取父级路径:"+file.getParent());
System.out.println("getPath()获取文件目录:"+file.getPath());
}
运行结果:

注意:getParent() 获取父级路径是创建时的父路径,而不是父路径的绝对路径,要获取父路径的绝对路径可以通过file.getParent().getAbsolutePath()来获取。
-----------------getPath()和getAbsolutePath()的不同点-----------------------------
getPath()得到的是构造file的时候的路径。
getAbsolutePath()得到的是绝对路径。如果构造的时候就是全路径那直接返回全路径;如果构造的时候时是相对路径,返回当前目录的路径+构造file时候的路径。
二、使用File类遍历目录
上面讲述了File类的一些简单的使用方法,这里稍微复杂一点,我们要学习通过File类来遍历目录,对目录进行一系列的操作。
这里我新建了一个File类的工具类,名为FileUtils。这个类的功能是:列出File的一些常用操作比如过滤、遍历等操作。把这些操作包装成一个工具类,以后使用这个工具类对File对象进行这些操作就方便多了。
首先选一个测试目录,就是刚刚那个d盘的code目录,往里面添加几个文本文件。
---------------------------------FileUtils类方法----------------------------------------
---------------列出指定目录下(包括其子目录)的所有文件---------------
列出目录下的文件方法有两种:list()和listFiles(),这两种方法有什么区别呢?
先看第一种方法list(),它返回的是String类型的数组
public static void listDirectory(File dir) throws IOException{
if(!dir.exists()){//目录不存在,抛出异常
throw new IllegalArgumentException("该目录不存在");
}
if(!dir.isDirectory()){//不是一个目录
throw new IllegalArgumentException("不是一个目录");
}
String[] filenames=dir.list();//list()方法返回一个String数组
for (String string : filenames) {
System.out.println(string);
}
}
主方法调用结果:

结果分析:可以看出list() 返回的是该目录下直接所有子目录和文件的名称,但不包含子目录下的内容。
那如何才能遍历到子目录下的文件呢?
如果要遍历目录下的内容就需要构造成File对象做递归操作,File提供了直接返回File对象的API,那就是listFiles()方法。
我把刚刚的方法修改后如下:
public class FileUtils {
/*
* 列出指定目录下(包括其子目录)的所有文件
*/
public static void listDirectory(File dir) throws IOException {
if (!dir.exists()) {// 目录不存在,抛出异常
throw new IllegalArgumentException("该目录不存在");
}
if (!dir.isDirectory()) {// 不是一个目录
throw new IllegalArgumentException("不是一个目录");
}
File[] files = dir.listFiles();
if (files != null && files.length > 0) {// 判断是否含有子目录
for (File file : files) {
if (file.isDirectory()) {// 如果是子目录,则做递归
listDirectory(file);
} else {// 如果是文件,则打印输出
System.out.println(file);
}
}
}
}
运行结果:

可以看到成功遍历了所有子目录下的文件并输出了。
-------------总结---------------
file.list() 返回的是 字符串数组 直接子目录的名称,不包含子目录下的内容。
file.listFiles() 返回的是直接子目录(文件)的对象。
这里只列出了几种常用的方法,更多File类的内容请自行查阅API哦~
File类只用于表示文件或目录,不能用于文件内容的访问;
而RandomAccessFile类提供的对文件内容的访问,既可以读文件,也可以写文件。
下期预告《RandomAccessFile类的使用》
【Java IO流】File类的使用的更多相关文章
- Java—IO流 File类的常用API
File类 1.只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. package cn.test; import java.io.File; import java.io.IOE ...
- JAVA:IO流——File类
1.掌握File 类的作用 2.可以使用File 类中的方法对文件进行操作 所有的 io 操作都保存在 java.io 包中. 构造方法:public File (String pathname) 直 ...
- Java IO流-File类
2017-10-24 23:50:22 File类 File类:文件和目录路径名的抽象表示形式.该文件或者目录不一定真实存在. * 构造方法 File类有四种构造方法,主要采用的构造方法师第二种,也就 ...
- Java IO流-File类的使用示例-创建文件夹和文件的正确方法
当创建一个文件时,比如:E:\\test\\test.txt,此时若文件夹test不存在,那么直接创建文件会出错,故首先要判断文件夹是否存在,不存在的话要首先创建文件夹. public class F ...
- java io包File类
1.java io包File类, Java.io.File(File用于管理文件或目录: 所属套件:java.io)1)File对象,你只需在代码层次创建File对象,而不必关心计算机上真正是否存在对 ...
- 09、IO流—File类与IO流
目录 一.File类 基本认识 实用方法 获取功能 重命名功能(包含剪切) 判断功能 创建.删除文件 实际小案例 二.IO流 1.认识IO流 2.IO流基类介绍 字节流基类介绍 字符流基类介绍 三.节 ...
- java IO之 File类+字节流 (输入输出 缓冲流 异常处理)
1. File类
- Java第三阶段学习(一、IO流------File类)
一.IO概述: 把内存中的数据存入到硬盘(持久化设备)中叫做:输出(写)Output操作.JAVA软件往电脑硬盘上走叫输出. 把硬盘中的数据读取到到内存里叫做:输入(读)Input操作.电脑硬盘上往J ...
- 021.1 IO流——File类
########################################IO流: IO:用于处理设备上的数据的技术.设备:内存,硬盘,光盘 流:系统资源,Windows系统本身就可 ...
- IO流——File类(文件流类)
java语言的输入输出操作是借助于输入输出包java.io来实现的,按传输方向分为输入流与输出流,从外设传递到应用程序的流为输入流,将数据从应用程序输入到外设的流为输出流. File类的构造方法: 1 ...
随机推荐
- 化繁为简(三)—探索Mapreduce简要原理与实践
目录-探索mapreduce 1.Mapreduce的模型简介与特性?Yarn的作用? 2.mapreduce的工作原理是怎样的? 3.配置Yarn与Mapreduce.演示Mapreduce例子程序 ...
- java基础(九章)
一.理解查询的机制 客户端应用程序(c/s.b/s)向后台服务器的DB发送一条select语句进行查询操作,会将结果集(虚拟表)返回到客户端应用程序 二.select语句 1.查询表中的全部列和行 s ...
- Dojo初探之5:dojo的request(请求)操作、请求过程事件绑定和隐藏数据data()操作(基于dojo1.11.2版本)
前言: 上一章详细阐述了dojo的事件绑定操作,本章将讲解dojo的请求操作 注:dojo的请求操作与js和jquery完全不同! 1.dojo的请求 dojo通过request.get()/.put ...
- 最短路径Floyd算法【图文详解】
Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被 ...
- 1.JAVA WEB 笔记中文乱码
JAVA WEB 乱码问题解析 乱码原因 在Java Web开发过程中,经常遇到乱码的问题,造成乱码的原因,概括起来就是对字符编码和解码的方式不匹配. 既然乱码的原因是字符编码与解码的方式不匹配,那么 ...
- 让getElementsByClassName兼容
function getElementsByClassName(node, classname){ if(node.getElementsByClassName){ //使用现有方法 return n ...
- 利用angular给节点添加样式
<!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <met ...
- 增强for循环用法
1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的, 但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容.不能获取 ...
- 并归排序 (Java版本,时间复杂度为O(n))
自己上网查了一下并归排序的定义,把两个排序好的数组重新组成一个排序好的数组就是并归排序, 实现的方式有和多种,自己思考了一下,用java实现了一版本,思路如下,既然是排序好的,只需要依次比较两个数组, ...
- 用 Docker Machine 创建 Azure 虚拟主机
搭建环境向来是一个重复造轮子的过程,Docker Machine 则把用户搭建 Docker 环境的各种方案汇集在了一起.笔者在<Docker Machine 简介>一文中演示了使用 Do ...