File类的使用
- 前言
- 一、File类概述
- 二、File类的使用
- 1. 绝对路径 vs 相对路径
- 2. 路径分隔符
- 3. 静态成员变量
- 3. 常用构造器
- 4. 常用方法
- 4.1 获取功能
- 4.2 重命名功能
- 4.3 判断功能
- 4.4 创建功能
- 4.5 删除功能
- 三、练习
- 1. 显示文件及文件夹内容
- 2. 统计文件夹大小
- 3. 复制文件夹
- 4. 剪切文件夹
- 5. 删除文件夹
- 6. 复制指定类型文件
前言
本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注!
分享ChatGPT的相关资料文档、最新资讯、玩法和创意,获取第一手信息,一起走在AI时代的最前线!前100名加入可赠送ChatGPT账号!
加入链接:https://t.zsxq.com/0cStvoskD
一、File类概述
(1)
java.io.File
类:文件和文件目录路径的抽象表示形式,与平台无关
(2)
File
类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO
流来完成。
(3) 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个
File
对象,但是Java程序中的一个File
对象,可能没有一个真实存在的文件或目录。
(4)
File
对象可以作为参数传递给流的构造器,指明读取或写入的”终点”。
二、File类的使用
1. 绝对路径 vs 相对路径
(1)绝对路径:是一个固定的路径,从盘符开始
(2)相对路径:是相对于某个位置开始
main()
方法中的相对路径是相对于当前工程- 单元测试方法中的相对路径是相对于当前模块
2. 路径分隔符
(1) 路径中的每级目录之间用一个路径分隔符隔开。
(2)路径分隔符和系统有关:
windows
和DOS
系统默认使用"\"
来表示- UNIX和URL使用
"/"
来表示
(3) Java程序支持跨平台运行,因此路径分隔符要慎用。
为了解决这个隐患,File类提供了一个常量:
public static final String separator
:根据操作系统,动态的提供分隔符。
File file1 = new File("d:\\atguigu\\info.txt");File file2 = new File("d:" + File.separator + "atguigu" + File.separator + "info.txt");File file3 = new File("d:/atguigu");
3. 静态成员变量
静态成员变量 | 描述 |
---|---|
public static String pathSeparator | 系统中多个路径的分隔符 windows; |
public static String separator | 系统中一个路径中多个名称之间的分隔符号 windows\ |
3. 常用构造器
构造器 | 描述 |
---|---|
public File(String pathname) | 以pathname 为路径创建File 对象,可以是绝对路径或者相对路径,如果pathname 是相对路径,则默认的当前路径在系统属性user.dir 中存储。 |
public File(String parent,String child) | 以parent 为父路径,child 为子路径创建File对象。 |
public File(File parent,String child) | 根据一个父File 对象和子文件路径创建File 对象 |
代码演示:
//构造器1 File file1 = new File("hello.txt");//相对于当前module File file2 = new File("D:\\workspace_idea1\\JavaSenior\\day08\\he.txt"); System.out.println(file1); System.out.println(file2); //构造器2: File file3 = new File("D:\\workspace_idea1","JavaSenior"); System.out.println(file3); //构造器3: File file4 = new File(file3,"hi.txt"); System.out.println(file4); }
4. 常用方法
4.1 获取功能
方法 | 描述 |
---|---|
public String getAbsolutePath() | 获取绝对路径 |
public String getPath() | 获取路径 |
public String getName() | 获取名称 |
public String getParent() | 获取上层文件目录路径。若无,返回null |
public long length() | 获取文件长度(即:字节数)。不能获取目录的长度。 |
public long lastModified() | 获取最后一次的修改时间,毫秒值 |
public String[] list() | 获取指定目录下的所有文件或者文件目录的字符串数组 |
public File[] listFiles() | 获取指定目录下的所有文件或者文件目录的File对象数组 |
代码演示:
@Test public void test2(){ File file1 = new File("hello.txt"); File file2 = new File("d:\\io\\hi.txt"); System.out.println(file1.getAbsolutePath()); System.out.println(file1.getPath()); System.out.println(file1.getName()); System.out.println(file1.getParent()); System.out.println(file1.length()); System.out.println(new Date(file1.lastModified())); System.out.println(); System.out.println(file2.getAbsolutePath()); System.out.println(file2.getPath()); System.out.println(file2.getName()); System.out.println(file2.getParent()); System.out.println(file2.length()); System.out.println(file2.lastModified()); } @Test public void test3(){ File file = new File("D:\\workspace_idea1\\JavaSenior"); String[] list = file.list(); for(String s : list){ System.out.println(s); } System.out.println(); File[] files = file.listFiles(); for(File f : files){ System.out.println(f); } }
4.2 重命名功能
方法 | 描述 |
---|---|
public boolean renameTo(File dest) | 把文件重命名为指定的文件路径 |
代码演示:
@Test public void test4(){ File file1 = new File("hello.txt"); File file2 = new File("D:\\io\\hi.txt"); boolean renameTo = file2.renameTo(file1); System.out.println(renameTo); }
4.3 判断功能
方法 | 描述 |
---|---|
public boolean isDirectory() | 判断是否是文件目录 |
public boolean isFile() | 判断是否是文件 |
public boolean exists() | 判断是否存在 |
public boolean canRead() | 判断是否可读 |
public boolean canWrite() | 判断是否可写 |
public boolean isHidden() | 判断是否隐藏 |
代码演示:
@Test public void test5(){ File file1 = new File("hello.txt"); file1 = new File("hello1.txt"); System.out.println(file1.isDirectory()); System.out.println(file1.isFile()); System.out.println(file1.exists()); System.out.println(file1.canRead()); System.out.println(file1.canWrite()); System.out.println(file1.isHidden()); System.out.println(); File file2 = new File("d:\\io"); file2 = new File("d:\\io1"); System.out.println(file2.isDirectory()); System.out.println(file2.isFile()); System.out.println(file2.exists()); System.out.println(file2.canRead()); System.out.println(file2.canWrite()); System.out.println(file2.isHidden()); }
4.4 创建功能
方法 | 描述 |
---|---|
public boolean createNewFile() | 创建文件。若文件存在,则不创建,返回false |
public boolean mkdir() | 创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。 |
public boolean mkdirs() | 创建文件目录。如果上层文件目录不存在,一并创建 |
注意事项: 如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
代码演示:
@Test public void test6() throws IOException { File file1 = new File("hi.txt"); if(!file1.exists()){ //文件的创建 file1.createNewFile(); System.out.println("创建成功"); }else{//文件存在 file1.delete(); System.out.println("删除成功"); } } @Test public void test7(){ //文件目录的创建 File file1 = new File("d:\\io\\io1\\io3"); boolean mkdir = file1.mkdir(); if(mkdir){ System.out.println("创建成功1"); } File file2 = new File("d:\\io\\io1\\io4"); boolean mkdir1 = file2.mkdirs(); if(mkdir1){ System.out.println("创建成功2"); } //要想删除成功,io4文件目录下不能有子目录或文件 File file3 = new File("D:\\io\\io1\\io4"); file3 = new File("D:\\io\\io1"); System.out.println(file3.delete()); }}
4.5 删除功能
方法 | 描述 |
---|---|
public boolean delete() | 删除文件或者文件夹 |
注意事项: Java中的删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
三、练习
1. 显示文件及文件夹内容
public static void showDir(File srcDir,int count) { System.out.println("|-" + srcDir.getName()); File[] files = srcDir.listFiles(); count++; for (File file : files) { System.out.print(printTab(count)); if (file.isFile()) { System.out.println("|-" + file.getName()); } else { showDir(file,count); } }}
2. 统计文件夹大小
public static long calculateDirSize(File srcDir) { long size = 0; File[] files = srcDir.listFiles(); for (File file : files) { if (file.isDirectory()) { size += calculateDirSize(file); } else { size += file.length(); } } return size;}
3. 复制文件夹
//使用 commons-io-2.11.0包的工具类,工具类忒好了 public static void copyDirUtil(File srcDir, File desDir) throws IOException { FileUtils.copyDirectory(srcDir, desDir); //底层也用的递归 }//自己递归实现 public static void copyDir(File srcDir, File desDir) throws IOException { if (!desDir.exists()) { desDir.mkdir(); } File newDir = new File(desDir, srcDir.getName()); newDir.mkdir(); File[] files = srcDir.listFiles(); if (files == null || files.length == 0) { return; } for (File file : files) { if (file.isDirectory()) { copyDir(file, newDir); } else { FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream(new File(newDir, file.getName())); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) != -1) { fos.write(buffer, 0, len); } fis.close(); fos.close(); } } }
4. 剪切文件夹
//使用 commons-io-2.11.0包的工具类,工具类忒好了 public static void cutDirUtil(File srcDir, File desDir) throws IOException { FileUtils.moveDirectory(srcDir,desDir); /*源码先复制,再删除*/ } //自己实现,在复制后紧接着删除源文件 public static void cutDir(File srcDir, File desDir) throws IOException { if (!desDir.exists()) { desDir.mkdir();//删除源文件夹 } File newDir = new File(desDir, srcDir.getName()); newDir.mkdir(); File[] files = srcDir.listFiles(); if (files == null || files.length == 0) { srcDir.delete(); return; } for (File file : files) { if (file.isDirectory()) { cutDir(file, newDir); } else { FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream(new File(newDir, file.getName())); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) != -1) { fos.write(buffer, 0, len); } fis.close(); fos.close(); //读写完后,删除源文件 file.delete(); } } srcDir.delete(); }
5. 删除文件夹
public static boolean deleteDir(File srcDir) { File[] files = srcDir.listFiles(); if (files == null || files.length == 0) { return srcDir.delete(); } for (File file : files) { if (file.isDirectory()) { deleteDir(file); } else { file.delete(); } } return srcDir.delete();}
6. 复制指定类型文件
//将符合条件的 文件路径-文件名 存到map集合中 public static Map<File, String> serchTypeFile(File srcDir, String desFileSuffix) { Map<File, String> map = new HashMap<>(); File[] files = srcDir.listFiles(); if (files == null) { return map; } for (File file : files) { if (file.isDirectory()) { map.putAll(serchTypeFile(file, desFileSuffix)); } else { if (file.getName().toLowerCase().endsWith(desFileSuffix)) { map.put(file.getAbsoluteFile(), file.getName()); } } } return map; } public static void copyTypeDir(File srcDir, File desDir, String desFileSuffix) throws IOException { Map<File, String> map = serchTypeFile(srcDir, desFileSuffix); Set<Map.Entry<File, String>> entries = map.entrySet(); for (Map.Entry<File, String> entry : entries) { File key = entry.getKey(); String value = entry.getValue(); System.out.println(key + "---" + value); /*挑选代码 ... */ //给文件加上时间戳,防止文件重名. //这里有点问题,时间戳到毫秒值,如果电脑够快,可能两个同名文件加的时间戳一样,会造成文件的覆盖,唉~~ //用(1)(2)的话,可以解决,但每次都要遍历新文件夹,好麻烦啊。 String[] names = key.getName().split("\\."); //正则表达式的关系 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS"); String format = sdf.format(new Date()); String s = names[0] + "(" + format + ")." + names[1]; File file = new File(desDir, s); FileUtils.copyFile(key,file); } }