File类(封装了操作文件和文件夹的方法)
1.表示一个文件
2.表示一个文件夹
3.表示一个文件的路径
File中的静态变量:
路径分割符
根据操作系统的不同,分割符就不同
Mac : /
window ; \
public static void fun1() {
String pathseparator = File.pathSeparator;//冒号 :
System.out.println(pathseparator);
String separator = File.separator;// 斜杠 /
System.out.println(separator);
}
绝对路径 : 该文件在当前硬盘上的路径 该路径是唯一的.
/Users/lanou/Desktop/afd 以斜杠开头
相对路径 :必须要有参照物, 不依斜杠开头
相对于参照物是你的工程
二 简单的方法
1.构造方法和判断文件是否存在.
public static void fun2() {
//构造方法
File file1 = new File("src/wl.txt");
//判断该文件是否存在
boolean a = file1.exists();
System.out.println(a);
//打印一下相对路径
System.out.println(file1.getAbsolutePath());
//利用父子路径创建File对象
File file2 = new File("/Users/lanou/Desktop", "afd");
boolean b = file2.exists();
System.out.println(b);
File parent = new File("/Users/lanou/Desktop");
String child = "afd";
//利用一个文件和 一个路径 创建File对象
File file3 = new File(parent, child);
boolean c = file3.exists();
//此方法既能创建多级也能创建一级文件夹
System.out.println(c);
}
2.创建文件和文件夹方法 获取文件名
public static void fun3() throws IOException {
//创建方法
File file1 = new File("/Users/lanou/Desktop/afd/wan");
//创建文件
boolean b1 = file1.createNewFile();
//该方法不会重复创建文件,只创建一次.只能创建文件(没有后缀也是文件)
System.out.println(b1);
//获取文件名方法
System.out.println(file1.getName());
//tostring 打印的是绝对路径
System.out.println(file1);
//创建文件夹
File file3 = new File("/Users/lanou/Desktop/afd/c");
// boolean b2 = file3.mkdir();
//该方法不能创建多级文件夹.
// System.out.println(b2);
boolean b3 = file3.mkdirs();
System.out.println(b3);
}
3.判断方法
public static void fun4() {
//判断
//判断是否存在
//判断是否是文件
//判断是否是隐藏文件
File file1 = new File("/Users/lanou/Desktop/afd/wan");
boolean b1 = file1.isFile();
boolean b2 = file1.isDirectory();
boolean b3 = file1.isHidden();
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
}
4.删除方法
public static void fun5() {
//删除方法(删除要慎重,不会经过回收站)
File file1 = new File("/Users/lanou/Desktop/afd/c");
boolean bb = file1.delete();
//该方法删除文件夹时,只能删除空文件夹
System.out.println(bb);
}
5.获取文件
public static void fun6() {
File file1 = new File("/Users/lanou/Desktop/afd");
//获取文件夹下的所有文件 以字符串形式
//获取的文件名是一级文件名
String [] arr = file1.list();
for (String string : arr) {
System.out.println(string);
}
//获取文件夹下的所有文件 以文件形式
File [] art = file1.listFiles();
for (File file : art) {
System.out.println(file);
}
}
6.遍历
需求:遍历打印Test文件夹下所有文件 封装一个方法(递归)
public static void printFile(File file) {
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
if (file2.isDirectory()) {
printFile(file2);
}else {
//文件
System.out.println(file2);
}
}
}
public static void main(String[] args) throws IOException {
File file1 = new File("/Users/lanou/Desktop/afd");
printFile(file1);
}
7.获取文件长度
public static void fun1() {
//获取文件的长度(获取文件的字节数)
File file = new File("/Users/lanou/Desktop/afd/dahai.txt");
//MAC下 一个英文字符一个字节 中文字符3个字节.
long num = file.length();
System.out.println(num);
}
8.
从控制台输入一个字符串 该字符串是文件夹路径 计算这个文件夹的大小
1.封装一个方法
判断是不是文件夹 如果是,就返回这个文件
public static File isDir() {
System.out.println("请输入你的地址");
Scanner scanner = new Scanner(System.in);
while (true) {
String string = scanner.nextLine();
File file = new File(string);
if (!file.exists()) {
isDir();
}
if (file.isFile()) {
System.out.println("你输入的是个文件,请重新输入");
}else {
System.out.println("走你");
return file;
}
}
}
2.封装一个方法
获取长度(此文件夹下所有文件的长度之和)
public static long getDirLength(File file) {
long sum = 0;
File[] files = file.listFiles();
for (File file2 : files) {
if (file2.isDirectory()) {//如果是文件目录再次调用此方法
sum = sum + getDirLength(file2);
}else {
sum =sum +file2.length();//是文件就获取长度累加
}
}
return sum;
}
9.删除一个文件夹
public static void deleteDir(File file) {
File [] arr = file.listFiles();
for (File file2 : arr) {
if (file2.isFile()) {//是文件先删除
file2.delete();
} else {
//继续遍历
deleteDir(file2);
}
}
//剩余一个空的文件夹 删除本文件夹
file.delete();
}
10. 输入一个文件夹路径 按层级关系以下面的格式 打印
a
b
哈哈.txt
c
嘿嘿.txt
dahai.txt
public static void main(String[] args) {
System.out.println("输入要打印的文件夹");
Scanner scanner = new Scanner(System.in);
String path = scanner.nextLine();
File file = new File(path);
printDir(file, 0);
}
public static void printDir(File file, int level) {
//循环出要打印的空格
String string = "";
for (int i = 0; i < level; i++) {
string+=" ";
}
File[] files = file.listFiles();
for (File subFile : files) {
if (!subFile.isHidden()) {
System.out.println(string+subFile.getName());
}
if (subFile.isDirectory()) {
printDir(subFile, level+1);
}
}
}
}
11.
输入一个文件夹路径 用map记录类型出现的次数
public class Demo03 {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
File file = new File("/Users/lanou/Desktop/afd");
getNum(map, file);
System.out.println(map);
}
public static void getNum(HashMap<String, Integer> map,File file) {
// 遍历所有文件
File[] files = file.listFiles();
for (File subFile : files) {
//判断是不是文件夹
if (subFile.isDirectory()) {
//是,重新调用该方法
getNum(map, subFile);
}else {
//不是文件夹就是文件
String name = subFile.getName();
String[] strings = name.split("\\.");
String strType = strings[1];
if (!map.containsKey(strType)) {
map.put(strType, 1);
}else {
Integer integer = map.get(strType);
integer++;
map.put(strType, integer);
}
}
}
}
}
{txt=4, css=1, pdf=1, DS_Store=3, png=1}
文件过滤器
文件过滤器(fileFilter) JDK1.2出来的
1.实现接口及方法
2.调用 listFiles(FileFilter filter) 方法
3.打印查看接口
JDK1.0 文件过滤器
listFiles(FilenameFilter filter)
1.获取文件夹里所有TXT文件
public static void fun1() {
File file = new File("/Users/lanou/Desktop/afd");
File[] files = file.listFiles(new Filter());
for (File file2 : files) {
System.out.println(file2);
}
}
public static void getTetFile(File file) {
File[] files = file.listFiles(new getTxtFile());
for (File file2 : files) {
if (file2.isDirectory()) {
//继续
getTetFile(file2);
}else {
//打印
System.out.println(file2.getName());
}
}
}
//过滤TXT
class getTxtFile implements FileFilter{
@Override
public boolean accept(File pathname) {
//把文件夹也过滤了 (错误的)
if (pathname.isDirectory()) {
//是文件夹直接保存进数组中
return true;
}
//判断后缀TXT
boolean b = pathname.getName().endsWith("txt");
return b;
}
}
2.
通过FilenameFilter过滤器获取指定目录中小于200K的小文件(200*1024)
public static void fun2() {
File file = new File("/Users/lanou/Desktop/afd");
File[] listFiles = file.listFiles(new MyFilenameFilter());
for (File file2 : listFiles) {
System.out.println(file2);
}
}
//打印所有小于200k的文件
public static void getFile(File file) {
File[] listFiles = file.listFiles(new My200KFilenameFilter());
for (File file2 : listFiles) {
if (file2.isDirectory()) {
//继续
getFile(file2);
}else {
//打印
System.out.println(file2.getName());
}
}
}
}
//过滤200k以上的文件
class My200KFilenameFilter implements FileFilter{
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()) {
return true;
}
return pathname.length()<200*1024;
}
}
通过以上两个例子,我们可以发现文件过滤器的用法: 定义一个新的过滤器类实现fileFilter接口.重写accept方法.
返回true 的时候,会把所有文件装到数组中
返回false 不会装到数组中
该方法的参数 是文件夹中所有的文件路径;
作用:
过滤掉你不需要的文件;