目录
一、文件的分类
二、文件路径
三、File 常见方法
1、get 相关方法使用
2、文件的创建和删除
3、遍历目录下所有文件
四、文件读写
站在程序员的角度,文件通常可以分为两类:
- 文本文件:以字符形式存储
- 二进制文件:以字节方式存储
有的朋友可能有疑惑:字符不也是由字节构成的吗?
是的,文本文件中的字符的确是由一个个相邻的字符构成的,但这些相邻的字节之间是存在关系的,而二进制文件里面存储的字节毫无关系!!
文件路径通常可以分为两类:
- 绝对路径(绝对路径 (absolute path) : 以一个盘符开头的路径,就是绝对路径)
- 相对路径(相对路径 (relative path) 一般是以
.或者..开头的路径.一般会有一个基准,去找对应的路径)
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述
File 属性:
| 修饰符及类型 | 属性 | 说明 |
|---|---|---|
| static String | pathSeparator | 依赖于系统的路径分隔符,String 类型的表示 |
| static char | pathSeparator | 依赖于系统的路径分隔符,char 类型的表示 |
构造方法:
| 签名 | 说明 |
|---|---|
| File(File parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
| File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径 |
| File(String parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示 |
方法:
| 方法签名 | 说明 |
|---|---|
| String getParent() | 返回 File 对象的父目录文件路径 |
| String getName() | 返回 FIle 对象的纯文件名称 |
| String getPath() | 返回 File 对象的文件路径 |
| String getAbsolutePath() | 返回 File 对象的绝对路径 |
| String getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
| boolean exists() | 判断 File 对象描述的文件是否真实存在 |
| boolean isDirectory() | 判断 File 对象代表的文件是否是一个目录 |
| boolean isFile() | 判断 File 对象代表的文件是否是一个普通文件 |
| boolean createNewFile() | 根据 File 对象,自动创建一个空文件。成功创建后返回 true |
| boolean delete() | 根据 File 对象,删除该文件。成功删除后返回 true |
| void deleteOnExit() | 根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行 |
| String[] list() | 返回 File 对象代表的目录下的所有文件名 |
| File[] listFiles() | 返回 File 对象代表的目录下的所有文件,以 File 对象表示 |
| boolean mkdir() | 创建 File 对象代表的目录 |
| boolean mkdirs() | 创建 File 对象代表的目录,如果必要,会创建中间目录 |
| boolean renameTo(File dest) | 进行文件改名,也可以视为我们平时的剪切、粘贴操作 |
| boolean canRead() | 判断用户是否对文件有可读权限 |
| boolean canWrite() | 判断用户是否对文件有可写权限 |
小练习:
package com;import java.io.File;
import java.io.IOException;public class Demo {public static void main(String[] args) throws IOException {File file = new File("./test.txt");// file 里边的路径是可以不存在的哦~~~System.out.println(file.getName());System.out.println(file.getAbsolutePath());System.out.println(file.getPath());System.out.println(file.getCanonicalPath());}
}
运行截图:
import java.io.File;
import java.io.IOException;public class FileDemo2 {public static void main(String[] args) throws IOException {File file = new File("./test.txt");System.out.println("创建前:");System.out.println("文件是否真实存在: "+file.exists());System.out.println("文件是否是一个目录: "+file.isDirectory());System.out.println("文件是否是一个普通文件: "+file.isFile());System.out.println("创建后:");System.out.println("文件创建是否成功: "+file.createNewFile());System.out.println("文件是否真实存在: "+file.exists());System.out.println("文件是否是一个目录: "+file.isDirectory());System.out.println("文件是否是一个普通文件: "+file.isFile());System.out.println("再次创建:");System.out.println("文件创建是否成功: "+file.createNewFile());}
}

import java.io.File;
import java.util.ArrayList;
import java.util.List;public class FileDemo9 {// 这里的result 用来记录每一个目录里面的路径public static List result = new ArrayList<>();public static void getAllFiles(String basePath){File file = new File(basePath);if(file.isFile()){//如果是一个文件就之间addresult.add(basePath);return ;}else if (file.isDirectory()){//这里是一个目录 就需要递归String[] files = file.list();for (String f : files){getAllFiles(basePath+"/"+f);}}else{//非普通文件,暂不考虑}}public static void main(String[] args) {getAllFiles(".");for (String s : result){System.out.println(s);}}
}
对文件的读写根据文件的类型大体可以分为两种:
- 字节流:针对二进制文件,以字节为单位进行读写
- 字符流:针对文本文件,以字符为单位进行读写
InputStream 读取:
| 方法 | 说明 |
|---|---|
| int read() | 读取一个字节的数据,返回 -1 代表已经完全读完了 |
| int read(byte[] b) | 最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了 |
| int read(byte[] b,int off, int len) | 最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了 |
| void close() | 关闭字节流 |
InputStream是一个抽象类.可用使用FileInputStream来实现.
| 构造方法 | 说明 |
|---|---|
| FileInputStream(File file) | 利用 File 构造文件输入流 |
| FileInputStream(String name) | 利用文件路径构造文件输入流 |
OutputStream 写入:
| 方法 | 说明 |
|---|---|
| void write(int b) | 写入要给字节的数据 |
| void write(byte[] b) | 将 b 这个字符数组中的数据全部写入 os 中 |
| int write(byte[] b, int off,int len) | 将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个 |
| void close() | 关闭字节流 |
| void flush() | 重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 |
OutputStream 也是一个抽象类,可以使用FileOutputStream来实现