本章整理Java File类相关的操作,和通过大量和文件操作相关的递归使用来进一步理解递归。
文章的整理转自:https://blog.youkuaiyun.com/magic_jss/article/details/51472205
1.基本概念
File:文件和目录路径名的抽象表示形式,代表文件或者文件夹。
注意了,一个File 对象只表示指向的路径,可以是文件或者文件夹,而且,它只指向最后一级目录。要创建该文件时,前面几级的目录要提前存在
2.构造方法
// 根据parent抽象路径名和child路径名字符串创建一个新File实例
File(File parent, String child)
// 通过将给定路径名字符串转换为抽象路径名来创建一个新File实例
File(String pathname)
// 根据parent路径名字符串和child路径名字符串创建一个新File实例
File(String parent, String child)
// 通过将给定的file:URI转换为一个抽象路径名来创建一个新的File实例
File(URI uri)
3.常用方法
(1).创建功能
// 创建此抽象路径名指定的目录
boolean mkdir()
// 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录
boolean mkdirs()
-mkdir()方法和mkdirs()方法的区别:
-mkdir():只能创建一级文件夹,多级文件夹会创建失败
-mkdirs():即可以创建多级文件夹,也可以创建一级文件夹
boolean createNewFile()
// 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称
static File createTempFile(String prefix, String suffix)
// 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称
static File createTempFile(String prefix, String suffix, File directory)
(2).删除功能
// 删除此抽象路径名表示的文件或目录
boolean delete()
//删除目录
System.out.println(file1.delete()); // false
//删除文件
System.out.println(file3.delete());// true
注:删除操作时,删除的是目录,则必须保证是空目录。
(3).判断功能
// 测试此抽象路径名表示的文件或目录是否存在
boolean exists()
// 测试此抽象路径名表示的文件是否是一个目录
boolean isDirectory()
// 测试此抽象路径名表示的文件是否是一个标准文件
boolean isFile()
// 测试此抽象路径名指定的文件是否是一个隐藏文件
boolean isHidden()
// 测试应用程序是否可以读取此抽象路径名表示的文件
boolean canRead()
// 测试应用程序是否可以修改此抽象路径名表示的文件
boolean canWrite()
File file = new File("F://hello");
File file2 = new File(file, "blog.txt");
// 判断是否存在
if (!file.exists()) {
// 创建目录
file.mkdir();
}
if (file2.exists()) {
// 创建文件
file2.createNewFile();
}
// 判断是否是目录
System.out.println(file.isDirectory());// true
// 判断是否是文件
System.out.println(file.isFile());// false
System.out.println(file2.isDirectory());// false
System.out.println(file2.isFile());// true
System.out.println(file2.isHidden());// false
// 判断是否是隐藏的
System.out.println(file2.isHidden());// false
// 判断是否可读
System.out.println(file2.canRead());// true
// 判断是否可写
System.out.println(file2.canWrite());// true
(4).获取功能
(1).基本获取功能
// 返回由此抽象路径名表示的文件或目录的名称
String getName()
// 返回此抽象路径名的绝对路径名形式
File getAbsoluteFile()
// 返回此抽象路径名的绝对路径名字符串
String getAbsolutePath()
// 将此抽象路径名转换为一个路径名字符串
String getPath()
// 返回此抽象路径名表示的文件最后一次被修改的时间
long lastModified()
File file = new File("F://hello");
File file2 = new File(file, "blog.txt");
// 判断文件或目录是否存在
if (!file.exists()) {
// 不存在则创建
file.mkdir();
}
if (file2.exists()) {
// 创建文件
file2.createNewFile();
}
//获取文件名或者目录名
System.out.println(file2.getName());// blog.txt
//获取文件或目录的绝对路径
System.out.println(file2.getAbsolutePath());// F:\hello\blog.txt
//获取文件或目录的路径名(绝对路径或者相对路径)
System.out.println(file2.getPath());// F:\hello\blog.txt
//获取文件或目录修改的最后时间返回毫秒值
System.out.println(file2.lastModified());// 1463734158963
(2).迭代获取功能,过滤器功能
// 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
String[] list()
// 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录
String[] list(FilenameFilter filter)
// 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
File[] listFiles()
// 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录
File[] listFiles(FileFilter filter)
// 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录
File[] listFiles(FilenameFilter filter)
图示:先看下F盘里面的东东

File file = new File("F://");
// 获取抽象路径名下的文件和目录
String[] s = file.list();
// 过滤文件或者目录名
String[] ss = file.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
// 返回以.png结尾的文件或者目录名
// 控制返回值判断是否添加到数组中
return name.endsWith(".png");
}
});
// 增强for输出
for (String string : s) {
System.out.print(string + " ");// $RECYCLE.BIN android4.0黑马 android视频......等等
}
// 增强for
for (String string : ss) {
System.out.print(string + " ");// ic_ptr_loading.png ic_ptr_pull.png ic_ptr_release.png
}
// 获取抽象路径名下的文件和目录对象
File[] files = file.listFiles();
// 获取抽象路径名下的文件和目录对象,添加文件过滤
File[] files2 = file.listFiles(new FileFilter() {
public boolean accept(File pathname) {
// 判断是否是隐藏目录
return (pathname.isDirectory()&&pathname.isHidden());
}
});
// 获取抽象路径名下的文件和目录对象,添加文件名过滤
File[] files3 = file.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
// 判断是否是以png结尾的文件
return (new File(dir, name).isFile())&&name.endsWith(".png");
}
});
for (File f : files) {
System.out.print(f.getName()+" ");//$RECYCLE.BIN android4.0黑马 android视频......等等
System.out.println();
for (File f : files2) {
System.out.print(f.getName()+" ");//$RECYCLE.BIN ghos
}
System.out.println();
for (File f : files3) {
System.out.print(f.getName());//ic_ptr_loading.pngic_ptr_pull.pngic_ptr_release.png
}
(5).重命名功能
// 重新命名此抽象路径名表示的文件boolean renameTo(File dest)
/*
* 创建两个文件对象,分别使用相对路径和绝对路径创建
*/
public class Test01 {
public static void main(String[] args) throws IOException {
String absolutePathStr = "D:c\\a.txt";
File file1 = new File(absolutePathStr);
File file2 = new File("a\\","c.txt");
file1.createNewFile();
file2.createNewFile();
//这里要注意的是:file1只指向最后一级a.txt这个文件对象;前面的路径要提前存在。
}
}
/*
* 检查 C 盘下是否存在文件 a.txt,如果不存在则创建该文件
*/
public class Test02 {
public static void main(String[] args) throws IOException {
File f = new File("D:\\a.txt");
if(!f.exists())
{
if(f.createNewFile())
System.out.println("文件创建成功");
}
}
}
/*
* 在 D 盘下创建一个名为 bbb 的文件夹
*/
public class Test03 {
public static void main(String[] args) {
File f = new File("D:\\bbb");
if(!f.exists())
{
if (f.mkdir()) {
System.out.println("文件夹创建成功");
}
}
}
}
/*
* 在 C 盘下创建一个名为 ccc 的文件夹,要求如下:
1.ccc 文件夹中要求包含 bbb 子文件夹
2.bbb 子文件夹要求包含 aaa 文件夹
*/
public class Test04 {
public static void main(String[] args) {
File f = new File("c:\\ccc\\bbb\\aaa");
if(f.mkdirs())
{
System.out.println("文件夹创建成功");
}
}
}
package card1;
import java.io.File;
/*
* 将 D 盘下 a.txt 文件删除
将 D 盘下 aaa 文件夹删除,要求文件夹 aaa 是一个空文件夹。
*/
public class Test05 {
public static void main(String[] args) {
File afile = new File("d:\\a.txt");
File aDir = new File("d:\\aaa");
deleteAFile(afile);
deleteADir(aDir);
}
private static void deleteADir(File aDir) {
if (aDir.isDirectory()) {
File[] files = aDir.listFiles();
if (files.length > 0) {
for (File f : files) {
if (f.isFile()) {
if (f.delete())
System.out.println("文件" + f.getName() + "删除成功");
} else if (f.isDirectory()) {
deleteADir(f);
}
}
if (aDir.delete())
System.out.println("文件夹" + aDir.getName() + "删除成功");
}
}
}
private static void deleteAFile(File afile) {
if (afile.exists())
if (afile.delete()) {
System.out.println(afile.getName() + "删除成功");
}
}
}
/*
* 获取 D 盘 aaa 文件夹中 b.txt 文件的文件名,文件大小,文件的绝对路径
* 和父路径等信息,并将信息输出在控制台。
*/
public class Test06 {
public static void main(String[] args) {
File file = new File("D:\\aaa\\b.txt");
printFileInfo(file);
}
private static void printFileInfo(File file) {
if(file.exists()&&file.isFile())
{
System.out.println("文件名:"+file.getName());
System.out.println("文件大小:"+file.length());
System.out.println("文件的绝对路径:"+file.getAbsolutePath());
System.out.println("文件的父路径:"+file.getParent());
}
else
{
System.out.println("文件不存在");
}
}
}
/*
*
1. 创建文件对象关联到指定文件夹,比如: d:/aaa
2. 调用文件对象的 listFiles 方法获得文件数组
3. 遍历文件数组将每一个文件的名字输出到控制台
*/
public class Test08 {
public static void main(String[] args) {
File dir = new File("d:\\test");
printFilesForDir(dir);
}
private static void printFilesForDir(File dir) {
if (dir.exists()) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
for (File f : files) {
if(f.isFile())
{
System.out.println(f.getName());
}
else if(f.isDirectory())
{
printFilesForDir(f);
}
}
}
} else {
System.out.println("文件夹:" + dir.getName() + "不存在");
}
}
}
/*
* 求 1 到 n 的和(n>=100 && n<=200)
*/
public class Test09 {
public static void main(String[] args) {
int sum = 0;
int n = 10;
sum = getSum(10);
System.out.println(sum);
}
private static int getSum(int n) {
if (n == 1)
return 1;
return getSum(n - 1) + n;
}
}
/*
* n = 1 return 1; n = 2 return 1+2 =3; n = 3 return 1+2+3 = 6
*
* n = n m(n) = m(n-1)+n
*
*
*
*
*/
package card2;
import java.io.File;
import java.util.Scanner;
/*
* 递归遍历将指定文件夹的所有文件(包括所有子文件夹的文件)的全路径输出在控制台
*/
public class Test03 {
public static void main(String[] args) {
System.out.println("输入一个文件夹路径:");
Scanner sc = new Scanner(System.in);
String path = sc.nextLine();
File dir = new File(path);
printDirFilesPath(dir);
}
private static void printDirFilesPath(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isFile()) {
if (!file.getParentFile().getName().equals("test2"))
{
System.out.println(" -" + file.getName() + ":" + file.getAbsolutePath());
}
else
{
System.out.println(file.getName() + ":" + file.getAbsolutePath());
}
} else if (file.isDirectory()) {
System.out.println(file.getName() + ":" + file.getAbsolutePath());
printDirFilesPath(file);
}
}
}
}
}
package card2;
import java.io.File;
/*
* 获得指定文件夹下所有的 java 文件(不考虑子文件夹的)并输出到控制台
* 1. 创建一个类实现文件过滤器 FileFilter 接口并重新 accept 方法,在该方法根据传入的文件
判断是否文件 Java 文件,如果是则返回 true,否则返回 false。
2. 根据文件夹路径字符串创建文件对象和创建文件过滤器接口实现类对象
3. 调用文件对象的 listFiles(FileFilter f) 方法,传递文件过滤器实现类对象。
4. 遍历文件数组,输入每一个文件对象
*/
public class Test04 {
public static void main(String[] args) {
File dir = new File("D:\\test");
new JavaFile().printJavaFile(dir);
}
}
interface FileFilter {
abstract boolean accept(File file);
}
class JavaFile implements FileFilter {
@Override
public boolean accept(File file) {
// 获取后缀名?
return file.isFile() && file.getName().endsWith(".java") ? true : false;
}
//打印Java文件方法
public void printJavaFile(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
for (File f : files) {
if (accept(f))
System.out.println(f.getName());
}
}
}
}
package card2;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
/*
* 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数
注意:用文件类型(后缀名,不包含.(点),如: "java","txt")作为 key,
用个数作为 value,放入到 map 集合中,并用两种方式遍历 map 集合
例如:
doc 的类型的文件有 3 个
java 的类型的文件有 5 个
txt 的类型的文件有 7 个
*/
public class Test05 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入一个文件夹路径:");
String pathStr = sc.nextLine();
File dir = new File(pathStr);
HashMap<String, Integer> hashMap = new HashMap<>();
getFileType(dir, hashMap);
for (String key : hashMap.keySet())
System.out.println(key + "类型的文件的有" + hashMap.get(key) + "个");
}
private static void getFileType(File dir, HashMap<String, Integer> hashMap) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
for (File file : files) {
// 如果是文件,则获取文件的后缀名。然后添加到hashMap中
if (file.isFile()) {
String lastFileName = getLastFileName(file);
// 加入hashMap中
if (hashMap.containsKey(lastFileName)) {
hashMap.put(lastFileName, hashMap.get(lastFileName) + 1);
} else {
hashMap.put(lastFileName, 1);
}
} else if (file.isDirectory()) {
getFileType(file, hashMap);
}
}
}
}
private static String getLastFileName(File file) {
String name = file.getName();
String lastName = name.substring(name.lastIndexOf('.') + 1, name.length());
return lastName;
}
}