file类
1.file 是文件和目录路径名的抽象表示形式.可以表示文件名、文件夹、文件路径(可以是错误路径)。
2.路径分类
相对路径:这个文件所在的路径与其它文件路径之间的关系。
绝对路径:文件在硬盘上的真实位置
public class Day18 {
public static void main(String[] args) {
//分隔符
String separator = File.separator;
System.out.println(separator);// /
String pathseparator = File.pathSeparator;
System.out.println(pathseparator);// :
//File类构造方法
File file = new File("src/hello.txt");//相对路径
//判断该路径是否存在
boolean b = file.exists();
System.out.println(b);//true
//获取绝对路径的方法
String absolutePath = file.getAbsolutePath();
System.out.println(absolutePath);///Users/lanou/Documents/SHJ180804/blog/src/hello.txt
//获取传入的路径
String path = file.getPath();
System.out.println(path);//src/hello.txt
//获取文件夹大小(字节)
long length = file.length();
//判断一个路径是不是文件
boolean b2 = file.isFile();
System.out.println(b2);//true
//判断一个路径是文件夹
boolean b3 = file.isDirectory();
System.out.println(b3);//false
}
}
//创建方法
public static void main(String[] args) throws IOException {
//创建方法
//创建单个文件方法,在路径的文件夹后写明要创建的文件夹
//传入的路径可能是错误的所以要抛出异常
File file = new File("/Users/lanou/Desktop/test/hello.txt");
boolean createNewFile = file.createNewFile();
System.out.println(createNewFile);//true
//创建单个文件夹方法
File file1 = new File("/Users/lanou/Desktop/test/h");
boolean mkdir = file1.mkdir();
System.out.println(mkdir);//true
//创建多层级文件夹方法(也可创建单层级文件夹)
File file2 = new File("/Users/lanou/Desktop/test/h");
boolean mkdirs = file1.mkdirs();
System.out.println(mkdirs);//true
}
//删除方法
public static void main(String[] args) throws IOException {
//删除方法(可以删除文件和空的文件夹)
File file = new File("/Users/lanou/Desktop/test/hello.txt");
boolean delete = file.delete();
//删除了hello.txt文件
System.out.println(delete);//true
}
public static void main(String[] args) throws IOException {
//list()获取文件夹下所有文件(一级目录)
File file = new File("/Users/lanou/Desktop/test");
//获取最后一个文件或文件夹名
String name = file.getName();
String[] strings = file.list();
//listFiles()以文件类型返回的
File[] files = file.listFiles();
for (File file2 : files) {
System.out.println(file2);
}
}
练习1:
封装一个方法 传入一个文件夹路径,打印该文件夹下 所有文件
public void printFiles(File file) {
File[] listFiles = file.listFiles();
for (File subFile : listFiles) {
//判断是不是文件
if (subFile.isFile()) {
//是文件直接打印
System.out.println(file);
}else {
//不是文件继续遍历
printFiles(subFile);
}
}
}
练习2:
//分装方法通过文件夹路径删除文件夹
public void deleteDir(File file) {
File[] listFiles = file.listFiles();
for (File subFile : listFiles) {
if (subFile.isFile()) {
//是文件直接删除
subFile.delete();
}else {
//不是文件继续遍历
deleteDir(subFile);
}
}
//删除空文件夹
file.delete();
}
练习3:
从控制台输入一个字符串
1.判断该字符串是文件夹路径,返回文件夹路径
2.计算这个文件夹的大小
//判断该字符串是文件夹路径
public File isFilePath() {
System.out.println("请输入字符串路径");
Scanner scanner = new Scanner(System.in);
while (true) {
String string = scanner.nextLine();
//创建文件对象
File file = new File(string);
if (file.exists()) {
//存在此路径
if (file.isDirectory()) {
//是文件夹
return file;
}else {
//不是文件夹
System.out.println("不是文件夹,请重试");
}
}else {
//不存在此路径
System.out.println("不存在此路径,请重试");
}
}
}
//接收路径计算文件夹大小
public long getDirLength(File file) {
long num = 0; //保存文件大小
File[] listFiles = file.listFiles();
for (File subFile : listFiles) {
if (subFile.isDirectory()) {
//是文件夹,遍历计算文件大小
num = num + getDirLength(subFile);
}else {
//是文件计算大小
num = num + subFile.length();
}
}
return num;
}
练习4:
输入一个文件夹路径 按层级关系 打印
public void printDirByLevel(File file, int level) {
String string = "";
for (int i = 0; i < level; i++) {
string = string + "\t";
}
File[] listFiles = file.listFiles();
for (File subFile : listFiles) {
//直接打印
System.out.println(string + subFile);
if (subFile.isDirectory()) {
//是文件夹
printDirByLevel(subFile, level + 1);
}else {
//是文件
System.out.println(string + subFile.getName());
}
}
}
练习5:
传入一个文件夹路径 用map记录类型出现的次数
public void getTypeNum(File file, HashMap<String, Integer> map) {
File[] listFiles = file.listFiles();
for (File subFile : listFiles) {
if (subFile.isFile()) {
//是文件
//获取文件名
String name = subFile.getName();
//切割文件名
String[] split = name.split("\\.");
String key = split[1];
if (map.containsKey(key)) {
//map中不存在key值
Integer value = map.get(key);
value++;
map.put(key, value);
}else {
//map中存在key值
map.put(key, 1);
}
}else {
//是文件夹
getTypeNum(subFile, map);
}
}
}
3.文件过滤器
1).FileFilter 接口
public class Day18 {
public static void main(String[] args) {
File file = new File("/Users/lanou/Desktop/test");
File[] listFiles = file.listFiles(new MyFileFilter());
for (File subFile : listFiles) {
System.out.println(subFile);
}
}
}
//实现接口的过滤方法
class MyFileFilter implements FileFilter{
返回false 数组中没有数据
返回true 打印数组中的一级目录文件和文件夹(与不传参数一样)
根据接口中这个方法的返回值:
true 就会把该文件存入到listFiles这个数组中
false 不会存入到listFiles数组中
综上listFiles数组中保存什么完全根据这个方法的返回值来看
参数pathname 一级目录下所有文件
public boolean accept(File pathname) {
//通过判断是否是文件和文件夹来过滤打印文件还是文件夹
return pathname.isDirectory();
}
}
2).FilenameFilter(接口) 过滤器
public class Day18 {
public static void main(String[] args) {
File file = new File("/Users/lanou/Desktop/test");
File[] listFiles = file.listFiles(new MyFileNameFilter());
System.out.println(listFiles);
}
}
//创建MyFileNameFilter类实现FilenameFilter接口
class MyFileNameFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
//dir为文件的目录路径,name为文件的文件名
System.out.println(dir + " " + name);
return false;
}
}