目录
[一, 文件](#一, 文件)
[二, File类](#二, File类)
一, 文件
1,什么是文件
文件一般分为两类:狭义上的文件和广义上的文件;狭义上的文件一般是针对硬盘上持久化存储的数据(比如硬盘上的文件和目录),而广义上的文件泛指计算机中的很多软硬件资源,操作系统中,把很多的硬件设备和软件资源抽象成了文件;本篇博客主要讨论的是狭义上的文件.
2,路径
我们在写Java程序代码时,存储数据主要是靠变量,每定义一个变量都是存储在内存上的,而这里说的文件则是存储在硬盘上的,每个文件在硬盘上都有一个具体的存储位置,称为"路径";路径又分为绝对路径和相对路径.
绝对路径 :以盘符开头的路径
此时 tmp 的目录的绝对路径就是 d:/tmp
相对路径 :以当前目录(也叫做工作目录:每个程序运行时都有一个工作目录)为基准,以 . 或者 .. 开头( . 有时候可以省略),找到指定的路径
此时所在的当前目录是 d:/tmp/aaa 如果以当前目录为工作目录表示 tmp 目录的话就可以表示为 ../
注意:
- 目录与目录之间的分隔符既可以用 / 也可以用 / 表示,但是大部分情况下推荐使用 / ,因为使用 \ 时容易出现转义字符的问题
- 使用相对路径表示路径时,当前目录可以表示为 ./ 上级目录可以表示为 ../
二, File类
- 在Java中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述,注意,有File对象并不代表真实存在的文件,但是可以对该file对象进行一些属性获取的操作;
- java中对于文件的操作可以分为针对文件系统的操作(文件的创建,删除和重命名)和针对文件内容的操作(文件的读和写).
1,File类的构造方法
|-----------------------------------|-----------------------------------------|
| ###### 签名 | ###### 说明 |
| File(File parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
| File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者 相对路径 |
| File(String parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用 路径表示 |
其中第二种最为方便也是最常用的一种构造方法
2,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() | 判断用户是否对文件有可写权限 |
2.1,get方法的使用
java
public static void main3(String[] args) throws IOException {
File file = new File("D:/xmy.txt");//并非真实存在这个文件
System.out.println(file.getName());
System.out.println(file.getParent());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
}
windows上盘符大小写都可以,其中创建的file对象并非真实存在,但是依然获取相关属性
2.2,普通文件的创建以及删除
java
public static void main(String[] args) throws IOException {
File file = new File("D:/xmy.txt");
System.out.println(file.exists());
file.createNewFile();
System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isDirectory());
file.delete();
System.out.println(file.exists());
}
2.3,普通目录文件的创建以及删除
java
public static void main7(String[] args) {
//对于目录进行删除的时候只能删除空目录或者单个文件
File file = new File("D:/aaaaa");
System.out.println(file.exists());
file.mkdir();
System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isDirectory());
file.delete();
System.out.println(file.exists());
}
- 目录创建时,如果是单级目录的话可以使用mkdir,如果是多级目录的话则必须使用mkdirs方法
- 删除目录的话不可以连续删除多级目录,只能删除空目录或者单个文件
3,代码示例
示例1
扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
java
mport java.io.File;
import java.util.Scanner;
public class Demo3 {
/**
* 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
*
* @param args
*/
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("请输入你要扫描的根目录: ");
String rootPath = scanner.next();
File root = new File(rootPath);
//如果被扫描的根目录是一个文件的话则无法进行搜索
if (!root.isDirectory()) {
System.out.println("输入的根目录有误!");
return;
}
System.out.println("请输入你要删除的文件名: ");
String nameToDelete = scanner.next();
//针对路径进行递归扫描
scanDir(root, nameToDelete);
}
private static void scanDir(File root, String nameToDelete) {
System.out.println("[scanDir]: " + root.getAbsolutePath());//查看一下递归的过程 将每一次的路径打印出来
//1.将该根目录下的所有目录和文件转换成一个文件数组
File[] files = root.listFiles();
if (files == null || files.length == 0) {
//当root目录下没有任何东西 目录为空 此时结束递归
return;
}
//2.对文件数组进行遍历
for (File f : files) {
//判断该文件是普通文件还是目录
if (f.isDirectory()) {
//文件是目录的话继续进行递归扫描
scanDir(f, nameToDelete);
} else {
//文件是文件的话判断是否是要删除的文件
if (f.getName().contains(nameToDelete)) {
//是需要删除的文件时循环用户是否进行删除
System.out.println("是否要删除 " + f.getAbsolutePath() + " 路径下的 " + f.getName() + " 文件?");
String choice = scanner.next();
if (choice.equals("y") || choice.equals("Y")) {
f.delete();
System.out.println("删除成功!");
} else {
System.out.println("取消删除!");
}
}
}
}
}
}
示例2
使用流对象对文件进行拷贝,这里涉及到了流对象,但是主要也是对于文件的相关操作,流对象的博客详解可以参考:文件操作中的IO流------字节流与字符流_蜡笔小心眼子!的博客-CSDN博客
java
import java.io.*;
import java.util.Scanner;
/**
* 使用流对象对文件进行拷贝
*/
public class Demo4 {
public static void main(String[] args) {
//输入两个路径 分别表示源路径和目标路径
//对于源路径需要判断是否存在
//对于目标路径需要判断是否已经存在
Scanner scanner = new Scanner(System.in);
System.out.println("请输入需要拷贝的路径: ");
String srcPath = scanner.next();
System.out.println("请输入需要被拷贝到的目标路径: ");
String destPath = scanner.next();
File srcFile = new File(srcPath);
if(!srcFile.isFile()) {
//如果源文件不是一个文件(是个目录或者不存在) 此时就不进行拷贝
System.out.println("您当前输入的原路径有误!");
return;
}
File destFile = new File(destPath);
if(destFile.isFile()) {
//如果已经存在 此时也不能进行拷贝
System.out.println("您输入的目标路径有误!");
return;
}
//进行拷贝操作
try(InputStream inputStream = new FileInputStream(srcFile);
OutputStream outputStream = new FileOutputStream(destFile)) {
//进行读写文件操作
while (true) {
int b = inputStream.read();
if(b == -1) {
break;
}
outputStream.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}