2.9.1 File
导包语句:java.io.File;
构造方法:
- new File(String 路径)
绝对路径:从盘符或者根目录出发,定位文件位置
相对路径:从当前程序认定的主目录(根目录所在的目录)出发,定位文件位置
-
new File(String 父目录 ,String 文件名)
-
new File(File 父目录对象,String 文件名)
关于路径分界符:Windows:/ \兼容
Linux :只认 /
File.separator路径分界符【效率低】
创建文件
:
//相对于当前程序所在的主目录出发
//定位我们想要找的文件: 相对路径
File file1 = new File("001.jpg");
//绝对路径:是从盘符或者根目录出发定位我们要的文件
File file2 = new File("C:\\Users\\5v\\Desktop\\2106\\day27 [File]\\001.jpg");
File file3 = new File("pics/001.jpg");
File file4 = new File("pics"+File.separator+"001.jpg");
StringBuffer buff = new StringBuffer();
buff.append("pics").append(File.separator).append("001.jpg");//等价于pics/001.jpg,但是他是StringBuffer类型的
String ok = buff.toString();//StringBuffer转成String
File file5 = new File(ok);
File file6 = new File("pics","001.jpg");
File file7 = new File("pics","a");
File file8 = new File(file7,"001.jpg");//file7为父目录对象
文件过滤器:FileFilter
public boolean accept(File f){
}
文件的递归查找:
-
我们需要一个能够过滤所有子目录的过滤器 – 最好使用单例(醉汉式)
-
我们需要一个能够过滤所有指定文件的过滤器 – 最好使用单例(懒汉式)
-
这才是整个程序最最重要的核心,那个递归调用的方法
这个方法应该有个参数 代表正要对付的那个目录…3-1: 利用1st开发完成的过滤器 得到目标目录中所有子目录
3-2: 利用2nd开发完成的过滤器 得到目标目录中所有指定文件
3-3: 判断3-1或者3-2得到的是不是null 防止没有权限导致空指针
3-4: 遍历3-1得到的所有子目录 再次调用3rd那个方法
3-5: 遍历3-2得到的所有指定文件 打印它
-
主方法当中利用listRoots()得到整台计算机所有的根目录
遍历每个根目录 挨个调用一次3rd方法…
全盘查找图片并打印
import java.io.*;
public class TestSearchAgain{
public static void main(String[] args){
File[] dir=File.listRoots();
for(File d:dir){
search(d);
}
}
public static void search(File tar){
File[] ds=tar.listFiles(DirFilter.getOnly());
File[] js=tar.listFiles(JpgFilter.getOnly());
if(ds==null||js==null)return;
for(File d:ds){
if(d.isDirectory()){
search(d);
}
}
for(File j:js){
System.out.println(j);
}
}
}
//过滤所有子目录的过滤器(单例模式中的醉汉式)
class DirFilter implements FileFilter{
private DirFilter(){}
private static DirFilter df=new DirFilter();
public static DirFilter getOnly(){
return df;
}
@Override
public boolean accept(File file){
return file.isDirectory();
}
}
//过滤所有图片文件的过滤器(单例模式中的懒汉式)
class JpgFilter implements FileFilter{
private JpgFilter(){}
private static JpgFilter jpg;
public static synchronized JpgFilter getOnly(){
if(jpg==null) return jpg=new JpgFilter();
return jpg;
}
@Override
public boolean accept(File f){
return f.isFile()&&f.getName().toLowerCase().endsWith(".jpg");
}
}
打印src目录下以及子目录下数量排行前五的重名的文件,
import java.io.*;
import java.util.*;
public class BigOneAG{
//定义一个静态的键值对集合Map,键为文件名,值为文件组成的列表
static Map<String,List<File>> map=new HashMap<>();
public static void main(String[] args){
File dir=new File("d:\\src");
kill(dir);
//定义一个与map键值位置颠倒的集合,根据list里面文件的多少降序排序
Map<List<File>,String> temp=new TreeMap<>((a,b)->{
Integer num1=a.size();
Integer num2=b.size();
return num1.equals(num2)?1:num2.compareTo(num1);});
map.forEach((name,list)->temp.put(list,name));
//将键值对集合temp横向切割,流式化(只能流式单值集合),只取前五个值,然后遍历输出
temp.entrySet().stream().limit(5).forEach((x)->{
String name=x.getValue();
List<File> list=x.getKey();
System.out.println(name+":"+list.size());
list.forEach((y)->System.out.println("\t"+y));
});
}
public static void kill(File f){
//ds中存放的是通过过滤后为目录的对象
File[] ds=f.listFiles((x)->x.isDirectory());
//js中存放的是通过过滤后为文件且后缀名为.java的对象
File[] js=f.listFiles((x)->x.isFile()&&x.getName().toLowerCase().endsWith(".java"));
if(ds==null)return;//如果ds为空,则不做处理,返回空[为空的情况:因权限进不去也判断为空];
for(File d:ds){
kill(d);//遍历了目录,将继续调用kill(),递归处理;
}
for(File j:js){
String name=j.getName();
if(map.containsKey(name)){
List<File> oldList=map.get(name);
oldList.add(j);
}else{
List<File> newList=new ArrayList<>();
newList.add(j);
map.put(name,newList);
}
}
}
}
运行结果如图:
判断外来设备输入
import java.io.*;
import java.util.*;
public class TestListRoots{
public static void main(String[] args)throws Exception{
File[] rts = File.listRoots();
while(true){
Thread.sleep(1000);
File[] nrts = File.listRoots();
if(rts.length != nrts.length){
List<File> before = new ArrayList<>(rts.length);
List<File> after = new ArrayList<>(nrts.length);
Collections.addAll(before,rts);
Collections.addAll(after,nrts);
after.removeAll(before);
System.out.println("新来连接的设备是:"+after);
}
}
}
}
打印D盘下src文件夹中名字最短/长的.java文件和文件大小最大/小的文件
import java.io.*;
import java.util.*;
public class BigOne{
static List<File> list=new ArrayList<>();
public static void main(String[] args){
File d=new File("d:\\src");
kill(d);
Collections.sort(list,(a,b)->{
Integer num1=a.getName().length();
Integer num2=b.getName().length();
return num1.compareTo(num2);
});
System.out.println("最短的名字:"+list.get(0).getName()+"\n最长的名字:"+list.get(list.size()-1).getName());
Collections.sort(list,(a,b)->{
Long size1=a.length();
Long size2=b.length();
return size1.compareTo(size2);
});
System.out.println("最小的文件"+list.get(0).getName()+"\n最大的文件"+list.get(list.size()-1).getName());
}
public static void kill(File f){
File[] ds=f.listFiles((x)->x.isDirectory());
File[] javas=f.listFiles((x)->x.isFile()&&x.getName().toLowerCase().endsWith(".java"));
if(ds==null) return;
for(File d:ds){
kill(d);
}
for(File js:javas){
list.add(js);
}
}
}
批量更改文件名
import java.io.*;
import java.util.*;
public class ExecListFiles{
public static void main(String[] args)throws Exception{
//1.创建一个File对象代表要去操作的文件夹
File dir = new File("exec");
//2.列出这个文件夹当中所有的文件对象
File[] fs = dir.listFiles();
//3.创建一个List集合 存所有符合要求的文件对象
List<File> list = new ArrayList<>();
//4.遍历2得到的所有文件对象 符合要求的.java 放入List集合中
for(File f : fs){
if(f.getName().toLowerCase().endsWith(".java")){
list.add(f);
}
}
//5.排序 按照修改时间 生序排列 Collections.sort();
Collections.sort(list,(a,b) -> (int)(a.lastModified() - b.lastModified()));
//6.定义一个代表新文件名序号的id变量
int id = 1;
//7.遍历那个排过序的List集合 准备重命名
for(File f : list){
//7.1 将int的id保存给字符串变量
String name = String.valueOf(id++);
//7.2 当字符串长度小于3位的时候
while(name.length() < 3){
//7.3 脑袋前面补0
name = "0" + name;
}
//7.4 补完脑袋 补屁股...(扩展名)
name += ".java";
//7.5 创建一个File对象代表目标文件 注意在dir目录里哦
File t = new File(dir,name);
//7.6 调用重命名的方法 renameTo();
f.renameTo(t);
}
}
}
特点优先级方法:3个
序号 | 方法 | 方法描述 |
---|---|---|
1 | File[] static listRoots() | 得到当前计算机所有根目录 |
2 | String[] list() | 得到一个目录里面所有文件的名字 |
3 | File[] listFiles() | 得到一个目录里面所有文件对象 |
一等优先级方法:12个
序号 | 方法 | 方法描述 |
---|---|---|
1 | boolean exists() | 判断File对象代表的文件或目录,是否已经存在 |
2 | boolean isFile() | 判断File对象代表的是不是一个文件~!isFile()是目录 |
3 | boolean isFileDirectory() | 判断File对象代表的是不是一个目录 |
4 | length() | 得到文件的字节数【只能对文件使用,不能对目录使用,否则得到非预期结果】 |
5 | boolean delete() | 删除File对象代表的文件或目录【目录不为空删除失败】 |
6 | boolean renameTo(目标文件) |
重命名文件或目录【源文件必须存在,目标文件!exists()】 源文件和目标文件可以是不同的目录结构,从而可以实现文件移动和剪切 |
7 | boolean mkdirs() | 创建多层不存在的目录结构【mkdir()目录第一层存在就无法创建】 |
8 | getName() | 得到文件或目录的名字 |
9 | getParent() | 得到文件或目录的父目录 |
10 | getAbsolutePath() | 得到文件或目录的绝对路径 |
11 | setLastModified() | 设置文件最后一次修改时间 |
12 | long lastModified() | 得到文件最后一次修改时间 |
把时间戳变成我们能看懂的日期:
时间戳:是从上世纪90年代末开始计算机行业广泛应用的时间的表达方式
1946年… 49 86 92… 99 – 00
|————————————————————|
约定的时间起点 想要表达的时间
1970-01-01 00:00:00 000
System.currentTimeMillis();
-
java.util.Date;
getYear() + 1900 getMonth()+1 getDate()
getHours() getMinutes() getSeconds()
getDay()[得到星期几]
File file = new File("001.jpg"); long time = System.currentTimeMillis(); Date theDate = new Date(time); System.out.println(theDate.getYear() + 1900);//2021 System.out.println(theDate.getMonth() + 1);//7 System.out.println(theDate.getDate());//26 System.out.println(theDate.getHours());//20 System.out.println(theDate.getMinutes());//41 System.out.println(theDate.getSeconds());//36
-
java.util.Calendar;
Calendar是单例模式下的定义,只有一个对象
getInstance()获得对象
setTimeInMillis()设置当前毫秒数
get(x) x:1(年) 2+1(月) 5(日) 11(时) 12(分) 13(秒) 7(星期【取值范围:1-7,需要减一运算真实星期:星期日:0,星期六:6 )
File file = new File("001.jpg"); long time = file.lastModified(); Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(time);//以毫秒为单位设置时间 System.out.println(cal.get(1));//2021 System.out.println(cal.get(2)+1);//3 System.out.println(cal.get(5));//8 System.out.println(cal.get(11));//17 System.out.println(cal.get(12));//52 System.out.println(cal.get(13));//50 System.out.println(cal.get(7));//2
-
java.text.SimpleDateFormat
format():从long转换成String
parse() 配合getTime()使用 :String转换成Date对象
.getTime()得到long毫秒数String birthday="1999-10-14"; String birthday2="1998-05-01"; SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd"); long time=f.parse(birthday).getTime(); long time2=f.parse(birthday2).getTime(); long now=System.currentTimeMillis(); System.out.println("今天是你人生中的第"+((now-time)/(24L*3600000)+1)+"天"); System.out.println("今天是我人生中的第"+((now-time2)/(24L*3600000)+1)+"天");
File类方法的使用
- exists():判断一个文件或目录是否存在
File file1 = new File("focus.txt");
System.out.println(file1.exists());
- isFile():判断File对象代表的是不是一个文件
- isDirectory():判断File对象代表的是不是一个目录
File f1 = new File("focus.txt");//当前目录已存在focus.txt文件
System.out.println(f1.isFile());//true
System.out.println(f1.isDirectory());//false
File f2 = new File("pics");//当前目录已存在pics文件
System.out.println(f2.isFile());//false
System.out.println(f2.isDirectory());//true
File f3 = new File("aslkdfjaklsdjfkladjfklajdklfa");//当前目录不存在的文件或目录
System.out.println(f3.isFile());//false
System.out.println(f3.isDirectory());//false
- length():得到文件的字节数
File file = new File("focus.txt");
System.out.println(file.length());//得到focus.txt文件的字节数
File dir = new File("pics");
System.out.println(dir.length());//得到pics目录中所有文件的字节数之和(有非预期结果)
- delete():删除File对象代表的文件或目录【目录不为空删除失败】
Thread.sleep(5000);
File file = new File("jay.png");//文件存在
file.delete();//删除成功
File dir = new File("c:\\windows");//删除c盘中windows文件夹
System.out.println(dir.delete());//目录并不为空,删除失败,返回值false
- renameTo(目标文件):重命名文件或目录【源文件必须存在,目标文件!exists()】
Thread.sleep(5000);
File src = new File("jay.png");//源文件已存在
File tar = new File("../gay.png");//目标文件不存在(若存在,则修改失败)
src.renameTo(tar);//名字修改成功
- mkdirs():创建多层不存在的目录结构【mkdir()目录第一层存在就无法创建】
StringBuffer buff = new StringBuffer();
for(int i = 0;i<10;i++){//利用循环创建嵌套目录
buff.append(i).append(File.separator);//0/1/2/3/4/5/6/7/8/9(目录结构)
}
String ok = buff.toString();
File dir = new File(ok);
dir.mkdirs();
- getName():得到文件或目录的名字
- getParent():得到文件或目录的父目录
- getAbsolutePath():得到文件或目录的绝对路径
File file = new File("abc/cba/focus.txt");
System.out.println(file.getName());//focus.txt
System.out.println(file.getParent());//abc\cba
System.out.println(file.getAbsolutePath());//D:\Users\Desktop\day27 [File]\abc\cba\focus.txt
- setLastModified():设置文件或目录最后一次修改的时间
- lastModified():得到文件或目录最后一次修改的时间
File file = new File("Note.txt");
long time = System.currentTimeMillis();
file.setLastModified(time - 4383L*24*60*60*1000);//把时间设回12年前
System.out.println(file.lastModified());//得到文件的最后一次修改时间(时间戳)
欢迎点赞与收藏,感谢支持!