操作系统中的数据都保存在文件中,而文件存放在相应的文件夹中。在Java当中,计算机中所有的文件和目录都用File这个类描述。
File类的出现在API中搜索File类,其描述为:File文件和目录路径名的抽象表示形式。
Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可。
File类构造函数与分隔符
查阅File的构造函数,发现原来File类有多个构造函数,可以构造File对象。
//File类会自动甄别文件系统路径Linux/Windows
//关联了一个相对路径的文件
File f1 = new File("haha.txt");
//特殊:对于当前的IDEA/Eclipse而言 相对路径获取的文件都在项目根目录下
System.out.println(f1.exists()); //项目根目录下的haha.txt文件
File f4 = new File("C:\Users\HENG\Desktop\YD_Java\src\Chapter11\haha.txt");
System.out.println(f4.exists()); //和此类同目录的haha.txt文件
//关联了一个绝对路径的文件
File f2 = new File("C:\Users\HENG\haha.txt");
//如果此路径是Linux的文件路径 / 根目录
File f3 = new File("/haha/xixi/lala");
File f5 = new File("C:\Users\HENG\Desktop\YD_Java\src\Chapter11","haha.txt");
System.out.println(f5.exists());
File parent = new File("C:\Users\HENG\Desktop\YD_Java\src\Chapter11");
File f6 = new File(parent,"haha.txt");
System.out.println(f6.exists());
//因为Linux/Unix/Windows/MAC这些操作系统中 路径分割符是不统一的
//当我们不确定程序所运行的系统环境 如果需要用到文件路径 路径分割符采用File自带的separator
String parentPath = "C:\Users\HENG\Desktop\YD_Java\src\Chapter11";
File f7 = new File(parentPath + File.separator + "haha.txt");
System.out.println(f7.exists());
File类的获取相关
File f = new File("C:\Users\HENG\Desktop\YD_Java\第11章笔记.txt");
//打印文件的绝对路径,即全路径
System.out.println(f.getAbsolutePath());
//文件对象中封装的路径是什么获取到的就是什么
System.out.println(f.getPath());
//获取文件名,即获取相对路径
System.out.println(f.getName());
//获取文件大小(单位字节 b)
System.out.println(f.length());
//最后一次修改时间(毫秒值),可以使用日期格式化把毫秒值转成字符串文本格式
System.out.println(f.lastModified());
// 毫秒值--Date--格式化--字符串文本
String str_date = DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.LONG).format(new Date(f.lastModified()));
System.out.println(str_date);
文件和文件夹的创建
//文件的创建 目录的创建
File f1 = new File("file01.txt");
//File f1 = new File("E:\file01.txt");
//E盘不存在 则报错 IOException
//文件不存在 则创建 返回 true
System.out.println(f1.createNewFile());
//文件已存在 则不创建 返回 false
System.out.println(f1.createNewFile());
//合理的创建方式 先判断 再考虑是否创建
if (!f1.exists()) {
f1.createNewFile();
}
//一般而言 目录是没有后缀名 文件也可以没有后缀名
File f2 = new File("haha");
if (!f2.exists()) {
f2.createNewFile();
}
//File dirc1 = new File("haha");
//上面已经有一个同名没后缀名的文件 从系统角度而言 属于重名内容 不允许创建
File dirc1 = new File("lala");
//创建一个目录
System.out.println(dirc1.mkdir());
File dirc2 = new File("xixi.txt");
System.out.println(dirc2.mkdir());
//上边xixi.txt目录已经创建 则同名的xixi.txt文件不允许创建
System.out.println(dirc2.createNewFile());
//总而言之,对于系统而言 无论是文件还是目录 只要重名都不能再创建新的了
//尽量创建文件时加上后缀名
//尽量创建目录时不要有非法字符存在(后缀名)
File dirc3 = new File("abc/def/ghi");
//mkdir一次只能创建一个一级目录
System.out.println(dirc3.mkdir());
//如果创建多级目录用mkdirs
System.out.println(dirc3.mkdirs());
文件和文件夹的删除
File f1 = new File("xixi.txt");
//删除一个目录,不走回收站
f1.delete();
//该目录中有多个子文件和其他子目录,不能直接删除
File f2 = new File("abc");
System.out.println(f2.delete());
//如果非得要删除的话 只能先将其内部的所有元素删除之后 再删除该目录
File f3 = new File("haha.txt");
f3.delete();
//总而言之 删除文件 用delete,delete只能删除单一的文件或单一的目录
//如果所删除的目录有内容,则不能删除,只能手动
子文件与文件过滤器
public static void main(String[] args) {
File dir = new File("C:\Users\HENG\Desktop\YD_Java");
//查看该目录下所有的文件(包含隐藏文件)
//list()返回的是该目录下第一层级的所有文件和目录的名字的字符串数组
MyFileNameFilter filter = new MyFileNameFilter();
String[] fileNames = dir.list(filter);//只能传关于名字的过滤
if (fileNames != null) {
for (String name : fileNames) {
System.out.println(name);
}
}
MyFileFilter filter2 = new MyFileFilter();
//listFiles()返回的是该目录下第一层级的所有文件和目录的File对象的一维数组
File[] files = dir.listFiles(filter2);//关于文件名 文件属性的过滤都行
if (files != null) {
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
}
dir.list();
}
public static class MyFileFilter implements FileFilter {
@Override
public boolean accept(File file) {
return file.length() > 2000;
}
}
public static class MyFileNameFilter implements FilenameFilter {
//File dir 父目录
//String name 当前文件的名称
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
}
获取文件夹全部内容
private static void printDirDieDai(File dir) {
linkedList queue = new linkedList<>();
queue.offer(dir);
while (!queue.isEmpty()) {
File file = queue.poll();
System.out.println("【" + file.getName() + "】");
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
if (f.isFile()) {
System.out.println(f.getName());
} else {
queue.offer(f);
}
}
}
}
}
private static void printDir(File dir,int level) {
System.out.println(getSpace(level) + "【" + dir.getName() + "】");
File[] files = dir.listFiles();
if (files == null) {
return;
}
for (File file : files) {
if (file.isFile()) {
System.out.println(getSpace(level + 1) + file.getName());
} else {
printDir(file,level + 1);
}
}
}
private static String getSpace(int level) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < level; i++) {
sb.append("--");
}
return sb.toString();
}
删除文件夹全部内容
private static void deleteDir(File dir) {
File[] files = dir.listFiles();
if (files == null) {
dir.delete();
return;
}
for (File file : files) {
if (file.isFile()) {
file.delete();
} else {
deleteDir(file);
}
}
dir.delete();
}



