java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。(可以写入文件是指定在哪个文件夹里创建文件,使用于Foreach循环中复制一个文件夹里的文件到另一个文件夹里)
public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
public class FileDemo {
@Test
public void test() {
//创建一个File实例,构造器是传入一个路径名
// windows:盘符 \ unix/linux: /
File file = new File("D:\\JAVASE\\day1\\code");
System.out.println("file实例:" + file);
}
@Test
public void test2() {
//public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例
String parent = "D:\\JAVASE";
String child = "day1";
String child2 = "day2";
String child3 = "day3";
//构建路径实例
File file = new File(parent,child);
File file2 = new File(parent,child2);
File file3 = new File(parent,child3);
System.out.println("file实例:" + file);
System.out.println("file2实例:" + file2);
System.out.println("file3实例:" + file3);
}
@Test
public void test3() {
//public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例
File parent = new File("D:\\JAVASE\\");
File parent2 = new File("D:\\JAVASE2\\");
String child = "day1";
File file = new File(parent,child);
File file2 = new File(parent2,child);
System.out.println("file实例:" + file);
System.out.println("file2实例:" + file2);
}
}
File对象是内存中的对象,代表硬盘中实际存在的一个文件或者目录。
无论该路径下是否存在文件或者目录,都不影响File对象的创建。(如果父路径不存在,则可以自动创建父路径)
public String getAbsolutePath() :返回此File的绝对路径名字符串。
public String getPath() :将此File转换为路径名字符串。
public String getName() :返回由此File表示的文件或目录的名称。
public long length() :返回由此File表示的文件的长度。
使用示例:(绝对路径和相对路径的区别如下)
绝对路径:从盘符开始的路径,这是一个完整的路径。
相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
@Test
public void test4() {
File file = new File("D:\\JAVASE\\day1\\code");
System.out.println("绝对路径名:" + file.getAbsolutePath());
System.out.println("路径字符串:" + file.getPath());
System.out.println("长度(文件大小):" + file.length());
System.out.println("文件夹名称:" + file.getName());
File file2 = new File("FileDemo.java");//相对路径
// C:\Users\Administrator\eclipse-workspace\day729(IO流)\FileDemo.java
System.out.println("相对路径:" + file2.getAbsolutePath());
}
public boolean exists() :此File表示的文件或目录是否实际存在。
public boolean isDirectory() :此File表示的是否为目录。
public boolean isFile() :此File表示的是否为文件。
@Test
public void test() {
File file = new File("D:\\JAVASE\\day1\\code");
System.out.println("file路径是否存在:" + (file.exists() == true ? "存在":"不存在"));
System.out.println("file是目录吗:" + (file.isDirectory() == true ? "是":"不是"));
System.out.println("file是文件吗:" + (file.isFile() == true ? "是":"不是"));
}
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
public boolean delete() :删除由此File表示的文件或目录。(注意:删除文件夹该文件夹必须为空----先删文件夹里的文件,再删空文件夹)
public boolean mkdir() :创建由此File表示的目录。
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。(父目录不存在)
@Test
public void test2() throws IOException {
//创建file实例
File file = new File("D:\\JAVASE\\day1\\code\\a.txt");
//创建一个新文件
file.createNewFile();
//创建临时文件
File file2 = new File("D:\\JAVASE\\day1\\code");
// 第一个参数是前缀,第二个是后缀,第三个是要在哪个路径下创建
File.createTempFile(System.currentTimeMillis()+"", ".exe",file2);
// java教程.api <-- 改名字
//删除a.txt
file.delete();//这是个文件 ,可以直接删除
//删除文件夹 这个文件必须是空的才能删除
File file3 = new File("D:\\JAVASE\\day1\\code2 - 副本");
file3.delete();
//创建新的文件夹
File file4 = new File("D:\\JAVASE\\day1\\code3");
//创建文件夹时,上级路径必须是存在
file4.mkdir();
File file5 = new File("D:\\JAVASE\\day1\\test\\code4");
//boolean isCreateSuccess = file5.mkdir();
//使用mkdirs:这时如果上级路径不存在,那么先创建上级路径 ,再创建目的文件夹
boolean isCreateSuccess = file5.mkdirs();
System.out.println("创建成功?" + isCreateSuccess);
}
public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
用法如下:
@Test
public void test3() {
File file = new File("D:\\JAVASE\\day1\\code");
//获取的是该文件夹下所有的字符串路径
String[] list = file.list();
for (String name : list) {
System.out.println(name);
}
System.out.println("-----------------");
//获取的是文件数组
File[] listFiles = file.listFiles();
for (File f : listFiles) {
System.out.println(f);
}
}
调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。
package com.gec.work;
import java.io.File;
import java.io.FileFilter;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
import org.junit.Test;
public class Work1 {
/*
* 【1】键盘录入一个文件夹路径,删除该路径下的文件夹。(录入的文件夹里面要有多个文件,不能包含有子文件夹)
* 提示:如果文件夹里面有文件,则需要先将文件删除才能删除文件夹
*/
@Test
public void test() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入文件夹路径:");
//接收路径
// next():不包含空格字符串,遇到空格就会结束
// String path = sc.next();
//包含空格
String path = sc.nextLine();
File file = new File(path);
//删除文件
delFile(file);
}
private void delFile(File file) {
//如果文件不存在,直接返回
if(!file.exists()) {
return;
}
if(file.isFile()) {
file.delete();//是文件就删除
}else {
File[] fs = file.listFiles();
for (File f : fs) {
//自己调用自己
delFile(f);
}
file.delete();//最终把当前的也删除掉
}
}
//从键盘接收一个文件夹路径,获得该文件夹大小并输出到控制台
//D:\JAVASE\day2
@Test
public void test2() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入文件夹路径:");
//创建File实例
File file = new File(sc.next());
//接收文件大小数
long size = getFile(file);
System.out.println("文件大小:" + size);
}
private long getFile(File file) {
//统计数
if(!file.exists()) {
return 0;
}
long length = 0;
//获取文件夹下所有的文件和子文件等
File[] fs = file.listFiles();
for (File f : fs) {
//先累加当前文件大小
length = length + f.length();
//如果是文件夹
if(f.isDirectory()) {
long s = getFile(f);
//666,666,541
//666,637,869
length = length + s;
}
}
return length;
}
@Test
public void test3() {
/*
使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印(包括所有子文件夹的文件)
*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入文件路径:");
//创建File实例
File file = new File(sc.next());
//显示过滤后的文件信息
showFile(file);
}
private void showFile(File file) {
File[] fs = file.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
//查找所有小于200k的文件
return f.length() < 200*1024 && !f.isDirectory();
}
});
//循环
for (File f : fs) {
System.out.println("文件名:" + f.getName() + ",大小:" + f.length());
}
}
@Test
public void test4() {
//键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数
Scanner sc = new Scanner(System.in);
System.out.println("请输入文件路径:");
//创建File实例
File file = new File(sc.next());
//显示过滤后的文件信息
if(file.isDirectory()) {
File[] fs = file.listFiles();
for (File f : fs) {
countType(f);
}
}else {
countType(file);
}
Set<String> keySet = map.keySet();
for (String key : keySet) {
System.out.println("文件类型:" + key + ",个数:" + map.get(key));
}
}
//统计用的集合
static HashMap<String, Integer> map = new HashMap<>();
private void countType(File file) {
//判断
if(file.isFile()) {
//HelloWorld.java为例 用.分割后,得到[HelloWorld,java]
String[] split = file.getName().split("\\.");
if(map.containsKey(split[split.length-1])) {
/*
* split[split.length-1]:{java=1}
* map.get:根据key获取map里面的值
* split[split.length-1])+1
*/
map.put(split[split.length-1], map.get(split[split.length-1])+1);
}else {
//第一次或唯一的文件统计
map.put(split[split.length-1],1);
}
}
}
}
筛选后缀名为mp4的文件
public void test() {
// 路径实例
File file = new File("D:\\JAVASE\\day6");
// 获得过滤后的文件数组
File[] fs = file.listFiles(new FilenameFilter() {//new FilenameFilter()是重点
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".mp4");
}
});
// 循环
for (File f2 : fs) {
System.out.println("mp4:" + f2.getName());
}
对于要重复筛选后缀名的文件,可以要重写一个类 ,作为文件名的过滤
//写一个类来继承FilenameFileter接口
class MyFileNameFilter implements FilenameFilter {
//定义一个name来接受传入的后缀名
private String name;
//定义有参构造器来接受对象的初始赋值
public MyFileNameFilter(String name) {
this.name = name;
}
@Override
public boolean accept(File dir, String name) {//可以选择,一个只传文件,一个可以传路径和定义的名字。本代码如此,也有其它可能
return name.endsWith(this.name);//定义筛选条件
}
}
public void test2() {
// 路径实例
File file = new File("\\JAVASE\\day6");
// 获得过滤后的文件数组
File[] fs = file.listFiles(new MyFileNameFilter(".mp4"));
for (File file2 : fs) {
System.out.println(file2.getName());
}
System.out.println("---------------------");
// 路径实例
File file2 = new File("D:\\JAVASE\\day7");
// 获得过滤后的文件数组
File[] fs2 = file2.listFiles(new MyFileNameFilter(".doc"));
for (File f2 : fs2) {
System.out.println(f2.getName());
}
}