java中的File类及常用方法【详细】

  • Post author:
  • Post category:java




2.9.1 File

导包语句:java.io.File;

构造方法:

  1. new File(String 路径)

绝对路径:从盘符或者根目录出发,定位文件位置

相对路径:从当前程序认定的主目录(根目录所在的目录)出发,定位文件位置

  1. new File(String 父目录 ,String 文件名)

  2. 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){

}

文件的递归查找:

  1. 我们需要一个能够过滤所有子目录的过滤器 – 最好使用单例(醉汉式)

  2. 我们需要一个能够过滤所有指定文件的过滤器 – 最好使用单例(懒汉式)

  3. 这才是整个程序最最重要的核心,那个递归调用的方法

    这个方法应该有个参数 代表正要对付的那个目录…

    3-1: 利用1st开发完成的过滤器 得到目标目录中所有子目录

    3-2: 利用2nd开发完成的过滤器 得到目标目录中所有指定文件

    3-3: 判断3-1或者3-2得到的是不是null 防止没有权限导致空指针

    3-4: 遍历3-1得到的所有子目录 再次调用3rd那个方法

    3-5: 遍历3-2得到的所有指定文件 打印它

  4. 主方法当中利用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();

  1. 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
    
  2. 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
    

  3. 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类方法的使用

  1. exists():判断一个文件或目录是否存在
File file1 = new File("focus.txt");
System.out.println(file1.exists());
  1. isFile():判断File对象代表的是不是一个文件
  2. 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

  1. 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目录中所有文件的字节数之和(有非预期结果)
  1. 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
  1. renameTo(目标文件):重命名文件或目录【源文件必须存在,目标文件!exists()】
		Thread.sleep(5000);
		File src = new File("jay.png");//源文件已存在
		File tar = new File("../gay.png");//目标文件不存在(若存在,则修改失败)
		src.renameTo(tar);//名字修改成功
  1. 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();

  1. getName():得到文件或目录的名字
  2. getParent():得到文件或目录的父目录
  3. 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
  1. setLastModified():设置文件或目录最后一次修改的时间
  2. 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());//得到文件的最后一次修改时间(时间戳)




欢迎点赞与收藏,感谢支持!

在这里插入图片描述



版权声明:本文为weixin_46659330原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。