File 类是 Java 中用于处理文件和目录的基本类之一,位于 java.io 包中。它提供了多种方法来创建、删除、检查、修改文件或目录的属性,以及列出文件夹中的内容。虽然 File 类本身不提供直接的读取或写入文件内容的方法(这些操作通常由 FileInputStream, FileOutputStream, BufferedReader, BufferedWriter 等类来完成),但它为文件和目录的操作提供了强大的功能。
1. File 类的构造方法
File 类的告急构造方法有:
- File(String pathname): 根据文件或目录的路径创建 File 对象。
- File file = new File("example.txt");
复制代码
- File(String parent, String child): 根据父路径和子路径创建 File 对象。
- File file = new File("C:/Documents", "example.txt");
复制代码
- File(File parent, String child): 根据父 File 对象和子路径创建 File 对象。
- File parentDir = new File("C:/Documents");
- File file = new File(parentDir, "example.txt");
复制代码 2. 文件和目录的创建与删除
如果文件不存在,则创建该文件,若文件已经存在,则不会覆盖它。返回 true 表现文件创建乐成,返回 false 表现文件已经存在。
- File file = new File("example.txt");
- if (file.createNewFile()) { System.out.println("文件创建乐成");} else { System.out.println("文件已存在");}
复制代码
创建单一目录。如果目录已经存在,则返回 false,如果创建乐成则返回 true。
- File dir = new File("newDirectory");
- if (dir.mkdir()) {
- System.out.println("目录创建成功");
- } else {
- System.out.println("目录已存在或创建失败");
- }
复制代码
创建多层目录,如果父目录不存在,也会一并创建。返回 true 表现乐成,false 表现失败。
- File dir = new File("parentDir/childDir");
- if (dir.mkdirs()) {
- System.out.println("多层目录创建成功");
- } else {
- System.out.println("创建失败");
- }
复制代码
删除文件或目录。如果文件/目录存在并且可以删除,则返回 true,否则返回 false。必要留意,删除操作是不可恢复的。
- File file = new File("example.txt");
- if (file.delete()) { System.out.println("文件删除乐成");} else { System.out.println("文件删除失败");}
复制代码 3 文件和目录的属性检查
检查文件或目录是否存在。
- if (file.exists()) {
- System.out.println("文件或目录存在");
- } else {
- System.out.println("文件或目录不存在");
- }
复制代码
检查 File 对象是否表现目录。如果是目录返回 true,否则返回 false。
- if (file.isDirectory()) {
- System.out.println("这是一个目录");
- }
复制代码
检查 File 对象是否表现文件。如果是文件返回 true,否则返回 false。
- if (file.isFile()) {
- System.out.println("这是一个文件");
- }
复制代码
- String getName(): 获取文件或目录的名称。
- String name = file.getName();
- System.out.println("文件名: " + name);
复制代码
- String getPath(): 获取文件或目录的路径。
- String path = file.getPath();
- System.out.println("路径: " + path);
复制代码
- long length(): 获取文件的字节数。对于目录,该方法返回 0。
- long size = file.length();
- System.out.println("文件大小: " + size + " 字节");
复制代码 4. 文件重定名与移动
boolean renameTo(File dest): 将当前文件重定名或移动到目的路径。如果乐成返回 true,否则返回 false。
- File newFile = new File("newExample.txt");
- if (file.renameTo(newFile)) {
- System.out.println("文件重命名成功");
- } else {
- System.out.println("文件重命名失败");
- }
复制代码 5. 文件权限操作
- boolean canRead(): 判断是否可以读取文件。
- if (file.canRead()) {
- System.out.println("文件可读");
- }
复制代码
- boolean canWrite(): 判断是否可以写入文件。
- if (file.canWrite()) {
- System.out.println("文件可写");
- }
复制代码
- boolean canExecute(): 判断是否可以执行文件。
- if (file.canExecute()) {
- System.out.println("文件可执行");
- }
复制代码 6. 文件列表和目录遍历
- String[] list(): 返回一个字符串数组,包罗当前目录中的所有文件和子目录的名称。
- File dir = new File("C:/Documents");
- String[] files = dir.list();
- if (files != null) {
- for (String filename : files) {
- System.out.println(filename);
- }
- }
复制代码
- File[] listFiles(): 返回一个 File 数组,包罗当前目录中的所有文件和子目录。
- File dir = new File("C:/Documents");
- File[] files = dir.listFiles();
- if (files != null) {
- for (File f : files) {
- System.out.println(f.getName());
- }
- }
复制代码 7. 常见留意事项
- 路径分隔符:在不同的操作系统中,路径分隔符可能不同。Windows 使用反斜杠(\),而 UNIX-like 系统(如 Linux 和 macOS)使用正斜杠(/)。Java 提供了 File.separator 来获取当前操作系统的路径分隔符,避免硬编码路径分隔符。
- String path = "folder" + File.separator + "example.txt";
复制代码
- 相对路径与绝对路径:File 可以使用相对路径(相对于项目根目录或当前工作目录)或绝对路径(以文件系统的根目录为起点)来表现文件或目录。
8 案例
场景
我们希望创建一个程序来处理用户上传的文件。程序会:
- 检查文件是否存在。
- 如果不存在,则创建一个新的文件。
- 在文件中写入一些数据。
- 读取文件中的数据。
- 最后删除文件。
- import java.io.*;public class FileExample { public static void main(String[] args) { // 文件路径 File file = new File("example.txt");
- // 1. 检查文件是否存在 if (file.exists()) { System.out.println("文件已存在"); } else { try { // 2. 如果文件不存在,创建一个新的文件 if (file.createNewFile()) { System.out.println("文件创建乐成"); } else { System.out.println("文件创建失败"); } } catch (IOException e) { System.out.println("发生错误: " + e.getMessage()); } } // 3. 向文件写入内容 try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { writer.write("Hello, this is a test file."); writer.newLine(); writer.write("This file was created and written by the FileExample program."); System.out.println("写入文件乐成"); } catch (IOException e) { System.out.println("写入文件时发生错误: " + e.getMessage()); } // 4. 读取文件内容 try (BufferedReader reader = new BufferedReader(new FileReader(file))) { String line; System.out.println("读取文件内容:"); while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { System.out.println("读取文件时发生错误: " + e.getMessage()); } // 5. 删除文件 if (file.delete()) { System.out.println("文件删除乐成"); } else { System.out.println("文件删除失败"); } }}
复制代码 9 综合练习
练习1:创建文件夹
在当前模块下的aaa文件夹中创建一个a.txt文件
代码实现:
- public class Test1 {
- public static void main(String[] args) throws IOException {
- //需求:在当前模块下的aaa文件夹中创建一个a.txt文件
- //1.创建a.txt的父级路径
- File file = new File("myfile\\aaa");
- //2.创建父级路径
- //如果aaa是存在的,那么此时创建失败的。
- //如果aaa是不存在的,那么此时创建成功的。
- file.mkdirs();
- //3.拼接父级路径和子级路径
- File src = new File(file,"a.txt");
- boolean b = src.createNewFile();
- if(b){
- System.out.println("创建成功");
- }else{
- System.out.println("创建失败");
- }
- }
- }
复制代码 练习2:查找文件(不考虑子文件夹)
定义一个方法找某一个文件夹中,是否有以avi末了的电影(临时不必要考虑子文件夹)
代码示例:
- public class Test2 {
- public static void main(String[] args) {
- /*需求:
- 定义一个方法找某一个文件夹中,是否有以avi结尾的电影。
- (暂时不需要考虑子文件夹)
- */
- File file = new File("D:\\aaa\\bbb");
- boolean b = haveAVI(file);
- System.out.println(b);
- }
- /*
- * 作用:用来找某一个文件夹中,是否有以avi结尾的电影
- * 形参:要查找的文件夹
- * 返回值:查找的结果 存在true 不存在false
- * */
- public static boolean haveAVI(File file){// D:\\aaa
- //1.进入aaa文件夹,而且要获取里面所有的内容
- File[] files = file.listFiles();
- //2.遍历数组获取里面的每一个元素
- for (File f : files) {
- //f:依次表示aaa文件夹里面每一个文件或者文件夹的路径
- if(f.isFile() && f.getName().endsWith(".avi")){
- return true;
- }
- }
- //3.如果循环结束之后还没有找到,直接返回false
- return false;
- }
- }
复制代码 练习3:(考虑子文件夹)
找到电脑中所有以avi末了的电影。(必要考虑子文件夹)
代码示例:
- public class Test3 {
- public static void main(String[] args) {
- /* 需求:
- 找到电脑中所有以avi结尾的电影。(需要考虑子文件夹)
- 套路:
- 1,进入文件夹
- 2,遍历数组
- 3,判断
- 4,判断
- */
- findAVI();
- }
- public static void findAVI(){
- //获取本地所有的盘符
- File[] arr = File.listRoots();
- for (File f : arr) {
- findAVI(f);
- }
- }
- public static void findAVI(File src){//"C:\\
- //1.进入文件夹src
- File[] files = src.listFiles();
- //2.遍历数组,依次得到src里面每一个文件或者文件夹
- if(files != null){
- for (File file : files) {
- if(file.isFile()){
- //3,判断,如果是文件,就可以执行题目的业务逻辑
- String name = file.getName();
- if(name.endsWith(".avi")){
- System.out.println(file);
- }
- }else{
- //4,判断,如果是文件夹,就可以递归
- //细节:再次调用本方法的时候,参数一定要是src的次一级路径
- findAVI(file);
- }
- }
- }
- }
- }
复制代码 练习4:删除多级文件夹
需求: 如果我们要删除一个有内容的文件夹
1.先删除文件夹里面所有的内容
2.再删除自己
代码示例:
- public class Test4 {
- public static void main(String[] args) {
- /*
- 删除一个多级文件夹
- 如果我们要删除一个有内容的文件夹
- 1.先删除文件夹里面所有的内容
- 2.再删除自己
- */
- File file = new File("D:\\aaa\\src");
- delete(file);
- }
- /*
- * 作用:删除src文件夹
- * 参数:要删除的文件夹
- * */
- public static void delete(File src){
- //1.先删除文件夹里面所有的内容
- //进入src
- File[] files = src.listFiles();
- //遍历
- for (File file : files) {
- //判断,如果是文件,删除
- if(file.isFile()){
- file.delete();
- }else {
- //判断,如果是文件夹,就递归
- delete(file);
- }
- }
- //2.再删除自己
- src.delete();
- }
- }
复制代码 练习5:统计巨细
需求:统计一个文件夹的总巨细
代码示例:
- public class Test5 {
- public static void main(String[] args) {
- /*需求:
- 统计一个文件夹的总大小
- */
- File file = new File("D:\\aaa\\src");
- long len = getLen(file);
- System.out.println(len);//4919189
- }
- /*
- * 作用:
- * 统计一个文件夹的总大小
- * 参数:
- * 表示要统计的那个文件夹
- * 返回值:
- * 统计之后的结果
- *
- * 文件夹的总大小:
- * 说白了,文件夹里面所有文件的大小
- * */
- public static long getLen(File src){
- //1.定义变量进行累加
- long len = 0;
- //2.进入src文件夹
- File[] files = src.listFiles();
- //3.遍历数组
- for (File file : files) {
- //4.判断
- if(file.isFile()){
- //我们就把当前文件的大小累加到len当中
- len = len + file.length();
- }else{
- //判断,如果是文件夹就递归
- len = len + getLen(file);
- }
- }
- return len;
- }
- }
复制代码 练习6:统计文件个数
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
jpg:6个
代码示例:
- public class Test6 {
- public static void main(String[] args) throws IOException {
- /*
- 需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
- 打印格式如下:
- txt:3个
- doc:4个
- jpg:6个
- */
- File file = new File("D:\\aaa\\src");
- HashMap<String, Integer> hm = getCount(file);
- System.out.println(hm);
- }
- /*
- * 作用:
- * 统计一个文件夹中每种文件的个数
- * 参数:
- * 要统计的那个文件夹
- * 返回值:
- * 用来统计map集合
- * 键:后缀名 值:次数
- *
- * a.txt
- * a.a.txt
- * aaa(不需要统计的)
- *
- *
- * */
- public static HashMap<String,Integer> getCount(File src){
- //1.定义集合用来统计
- HashMap<String,Integer> hm = new HashMap<>();
- //2.进入src文件夹
- File[] files = src.listFiles();
- //3.遍历数组
- for (File file : files) {
- //4.判断,如果是文件,统计
- if(file.isFile()){
- //a.txt
- String name = file.getName();
- String[] arr = name.split("\\.");
- if(arr.length >= 2){
- String endName = arr[arr.length - 1];
- if(hm.containsKey(endName)){
- //存在
- int count = hm.get(endName);
- count++;
- hm.put(endName,count);
- }else{
- //不存在
- hm.put(endName,1);
- }
- }
- }else{
- //5.判断,如果是文件夹,递归
- //sonMap里面是子文件中每一种文件的个数
- HashMap<String, Integer> sonMap = getCount(file);
- //hm: txt=1 jpg=2 doc=3
- //sonMap: txt=3 jpg=1
- //遍历sonMap把里面的值累加到hm当中
- Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
- for (Map.Entry<String, Integer> entry : entries) {
- String key = entry.getKey();
- int value = entry.getValue();
- if(hm.containsKey(key)){
- //存在
- int count = hm.get(key);
- count = count + value;
- hm.put(key,count);
- }else{
- //不存在
- hm.put(key,value);
- }
- }
- }
- }
- return hm;
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |