• File类与IO流相关面试知识(一)


    一.java.io.File类

    作用:它的作用是用来表示某个文件或文件夹(文件夹又称为目录)

    如何用File类的对象表示一个文件或目录的呢?

    API文档中描述:文件和目录路径名的抽象表示形式

    解释:如果要表示一个文件或目录,需要指定它的“路径名”

    例如:要表示Windows操作系统下的D盘Download文件夹下的大学资料.zip

    那么可以这样表示 File file = new File("d:\\Download\\大学资料.zip");

    要表示Windows操作系统下的D盘Download文件夹

    那么可以这样表示 File file = new File("d:\\Download");

    路径分隔符:

            早期Windows只支持  \

            现在所有平台都支持  /

    二.File类的常用方法系列1

    public String getName():返回由此File表示的文件或目录的名称

    public long length():返回由此File表示的文件的长度。

            返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。

    public String getPath():将此File转换为路径名字符串。

    public long lastModified():返回File对象对应的文件或目录的最后修改时间(毫秒值)

    三.各种路径问题

    路径名词

    (1)绝对路径和相对路径

    绝对路径:在描述文件或文件夹时,从根目录开始导航的路径

            对于windows操作系统来说,盘符就是根

                    如:d:/Download

                    d:/Download/大学资料.zip

            对于linux操作系统来说,/ 就是根

                    /Download

    相对路径:在描述文件或文件夹下,不是从根目录开始导航的路径

            例如:download/1.txt

    相当于谁呢?

            对于IDEA中,JUnit的test方法,相对路径是相当于当前的模块

            对于IDEA中,main方法,相对路径是相当于当前的project

    (2)构造路径

    在new File()对象时,在()中填写的路径。

    构造路径可以是相对路径,也可以是绝对路径。

    (3)规范路径

    如果路径名中出现了".."等情况,会进行解析

    String getPath():获取的是构造路径的值

    String getAbsolutePath():获取绝对路径的值

    String getCanonicalPath():获取规范路径的值

    (4)File类的常用方法系列3

    创建文件和文件夹的方法

    public boolean createNewFile() throws IOException:创建一个新文件

    public boolean mkdir():创建文件夹,这个是文件夹只能一个一个创建

    public boolean mkdirs():创建文件夹,这个是文件夹的多个目录可以一起创建

    public Boolean delete():删除文件或文件夹

            如果文件夹是非空目录,那么是无法删除的。即只能删除空文件夹。

    (5)判断某个File对象代表的文件或文件夹的情况:

    public boolean exists():此File表示的文件或目录是否实际存在

    public boolean isDirectory():此File表示的是否为目录

    public boolean isFile():此File表示的是否为文件

    如果指定的某个文件或文件夹的路径名后,这个文件或文件夹在实际的路径下不存在,不影响创建File类的对象。

    如果File类对象的代表的文件或文件夹不存在,那么它既不是文件夹也不是文件。

    (6)对于文件夹的File对象来说,可以进行如下操作:

    public String[] list():返回一个String数组,表示该File目录中的所有的子文件或目录。

    public File[] listFiles():返回一个File数组,表示该File目录中的所有的子文件或目录

    public File[] listFiles(FileFilter filter):返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(File pathname)方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。

    public String[] list(FilenameFilter filter):返回返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FilenameFilter .accept(File dir, String name)方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。

    public File[] listFiles(FilenameFilter filter):返回返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FilenameFilter .accept(File dir, String name)方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。

    java.io.FileFilter:文件过滤接口

            抽象方法:boolean accept(File pathname)

            pathname是某个文件夹在列出下一级时的每一个下一级

            如果pathname根据某个条件返回true,就表示要留下这个文件或文件夹。

    代码整合:

    1. public class TestFile {
    2. @Test
    3. public void test17(){
    4. //获取download下面的所有图片 以.jpg为例
    5. File dir = new File("d:\\download");
    6. listAllJpgImageSubs(dir);
    7. }
    8. public void listAllJpgImageSubs(File dir){
    9. if(dir.isDirectory()){//条件成立的话,说明是一个存在的文件夹
    10. File[] files = dir.listFiles(new FileFilter() {
    11. @Override
    12. public boolean accept(File pathname) {
    13. return pathname.getName().endsWith(".jpg") || pathname.isDirectory();
    14. }
    15. });
    16. for (File sub : files) {
    17. if(sub.isDirectory()){
    18. listAllJpgImageSubs(sub);
    19. }else{
    20. System.out.println(sub);
    21. }
    22. }
    23. }
    24. }
    25. @Test
    26. public void test16() {
    27. File dir = new File("d:\\download");
    28. listAllSubs(dir);
    29. }
    30. public void listAllSubs(File dir){
    31. if(dir.isDirectory()){//条件成立的话,说明是一个存在的文件夹
    32. System.out.println(dir);
    33. File[] files = dir.listFiles();
    34. for (File sub : files) {
    35. if(sub.isDirectory()){
    36. listAllSubs(sub);
    37. }else{
    38. System.out.println(sub);
    39. }
    40. }
    41. }
    42. }
    43. /*public void listAllSubs(File dir){
    44. System.out.println(dir);
    45. if(dir.isDirectory()){//条件成立的话,说明是一个存在的文件夹
    46. File[] files = dir.listFiles();
    47. for (File sub : files) {
    48. listAllSubs(sub);
    49. }
    50. }
    51. }*/
    52. @Test
    53. public void test15(){
    54. File dir = new File("d:\\download");
    55. String[] allSubs = dir.list();
    56. for (String sub : allSubs) {
    57. System.out.println(sub);
    58. }
    59. }
    60. @Test
    61. public void test14() throws IOException {
    62. File file = new File("d:/Download/北华大学实训归档材料-王海龙.zip");
    63. System.out.println(file.exists());//true
    64. System.out.println(file.isDirectory());//false
    65. System.out.println(file.isFile());//true
    66. }
    67. @Test
    68. public void test13(){
    69. File file = new File("d:\\1.txt");
    70. //new File对象只是在JVM的堆内存中创建一个对象,不会真的在硬盘中创建一个文件或文件夹。
    71. //只有调用createNewFile或mkdir/mkdirs才会创建文件或文件夹
    72. System.out.println(file.exists());//false
    73. System.out.println(file.isDirectory());//false
    74. System.out.println(file.isFile());//false
    75. System.out.println(file.length());//0
    76. System.out.println(file.lastModified());//0
    77. }
    78. @Test
    79. public void test12(){
    80. File file = new File("download\\1.txt");
    81. file.delete();
    82. File dir = new File("download");
    83. dir.delete();
    84. }
    85. @Test
    86. public void test11() throws IOException {
    87. File dir = new File("d:\\io\\java\\test\\aa");//dir是代表aa文件夹
    88. //dir.mkdir();//如果d:\io\java\test文件夹不存在,aa文件夹创建失败,但是不会报异常
    89. dir.mkdirs();//如果d:\io\java\test文件夹不存在,连同它们和aa一起创建
    90. }
    91. @Test
    92. public void test10() throws IOException {
    93. File file = new File("d:/Download/北华大学实训归档材料-王海龙.zip");
    94. System.out.println(file.getPath());//d:\Download\北华大学实训归档材料-王海龙.zip
    95. System.out.println(file.getAbsolutePath());
    96. //d:\Download\北华大学实训归档材料-王海龙.zip
    97. System.out.println(file.getCanonicalPath());
    98. //D:\Download\北华大学实训归档材料-王海龙.zip
    99. }
    100. @Test
    101. public void test09() throws IOException {
    102. File file = new File("../../../download/1.txt");
    103. System.out.println(file.getPath());//..\..\..\download\1.txt
    104. System.out.println(file.getAbsolutePath());
    105. //D:\atguigu\javaee\JavaSE20220106\JavaSECode\day0218_22teacher_code\..\..\..\download\1.txt
    106. System.out.println(file.getCanonicalPath());
    107. //D:\atguigu\javaee\download\1.txt
    108. }
    109. @Test
    110. public void test08() throws IOException {
    111. File file = new File("d:/Download/北华大学实训归档材料-王海龙.zip");
    112. System.out.println(file.getPath());//d:\Download\北华大学实训归档材料-王海龙.zip
    113. System.out.println(file.getAbsolutePath());
    114. //d:\Download\北华大学实训归档材料-王海龙.zip
    115. }
    116. @Test
    117. public void test07() throws IOException {
    118. File file = new File("download/1.txt");
    119. System.out.println(file.getPath());//download\1.txt
    120. System.out.println(file.getAbsolutePath());
    121. //D:\atguigu\javaee\JavaSE20220106\JavaSECode\day0218_22teacher_code\download\1.txt
    122. }
    123. public static void main(String[] args) throws IOException{
    124. File dir = new File("download");
    125. dir.mkdir();//make directory
    126. File file = new File("download/1.txt");
    127. file.createNewFile();
    128. }
    129. @Test
    130. public void test06() throws IOException {
    131. File dir = new File("download");
    132. dir.mkdir();//make directory
    133. File file = new File("download/1.txt");
    134. file.createNewFile();
    135. }
    136. @Test
    137. public void test05() {
    138. File file = new File("d:/Download");
    139. System.out.println(file);
    140. System.out.println("文件夹名字:" + file.getName());
    141. System.out.println("文件夹路径名:" + file.getPath());
    142. System.out.println("文件夹大小:" + file.length());//错误的
    143. System.out.println("最后修改时间:" +file.lastModified());
    144. long time = file.lastModified();
    145. Date date = new Date(time);
    146. System.out.println("最后修改时间:" + date);
    147. }
    148. @Test
    149. public void test04() {
    150. File file = new File("d:/Download/北华大学实训归档材料-王海龙.zip");
    151. System.out.println(file);
    152. System.out.println("文件名字:" + file.getName());
    153. System.out.println("文件路径名:" + file.getPath());
    154. System.out.println("文件大小:" + file.length());
    155. System.out.println("最后修改时间:" +file.lastModified());
    156. long time = file.lastModified();
    157. Date date = new Date(time);
    158. System.out.println("最后修改时间:" + date);
    159. }
    160. @Test
    161. public void test03() {
    162. File file = new File("d:/Download/北华大学实训归档材料-王海龙.zip");
    163. System.out.println(file);
    164. }
    165. @Test
    166. public void test02() {
    167. File file = new File("d:\\Download","北华大学实训归档材料-王海龙.zip");
    168. System.out.println(file);
    169. }
    170. @Test
    171. public void test01(){
    172. File file = new File("d:\\Download\\北华大学实训归档材料-王海龙.zip");
    173. File dir = new File("d:\\Download");
    174. System.out.println(file);
    175. System.out.println(dir);
    176. }
    177. }

    练习题(1):求某个目录(某个文件夹)总大小

    1. public class Exercise1 {
    2. public static void main(String[] args) {
    3. File dir = new File("d:\\学习资料");
    4. // System.out.println(dir.length());//无法直接通过length方法获取文件夹的总大小
    5. System.out.println(getDirectoryLength(dir));
    6. }
    7. public static long getDirectoryLength(File dir){
    8. /*
    9. 用一个变量,累加这个文件夹里面(包含下一级的下一级)的文件的大小。
    10. */
    11. long sum = 0;
    12. if(dir.isFile()){//如果dir是文件,那么直接用length方法表示大小
    13. sum = dir.length();
    14. }else if(dir.isDirectory()){
    15. //列出文件夹的下一级
    16. File[] files = dir.listFiles();
    17. for (File sub : files) {//sub是dir的下一级,它可能是一个文件,也可能是一个文件夹
    18. // sum += sub的大小;
    19. sum += getDirectoryLength(sub);
    20. }
    21. }
    22. return sum;
    23. }
    24. }

    练习题(2):递归删除非空目录

    1. public class Exercise2 {
    2. public static void main(String[] args) {
    3. //友情提示:找一个没有用的文件夹测试,不然删除后,不在回收站
    4. File dir = new File("d:\\学习资料");
    5. // dir.delete();
    6. forceDeleteDirectory(dir);
    7. }
    8. public static void forceDeleteDirectory(File dir){
    9. /*
    10. 思路:先把dir的下一级干掉,再删除dir自己
    11. */
    12. //先把dir的下一级干掉
    13. if(dir.isDirectory()){
    14. File[] files = dir.listFiles();
    15. for (File sub : files) {//sub是dir的下一级,可能是文件,可能是文件夹,而且文件夹可能是非空的
    16. forceDeleteDirectory(sub);
    17. }
    18. }
    19. //删除dir自己
    20. dir.delete();
    21. }
    22. }
  • 相关阅读:
    [oeasy]python0024_ 输出时间_time_模块_module_函数_function
    【SpringBoot】SpringBoot2的一些特性
    QT 自定义QGraphicsItem 缩放后旋转 图形出现漂移问题
    flutter播放rtmp视频
    零基础小白学习 Python,应该如何配置 Python 开发环境?(包含Windows、MacOS、Linux)
    Next.js 13 appDir 实战 i18n
    Appx代码签名指南
    怎样在CSDN插入代码块 怎么变色?
    TDengine Restful Authorization 自定义Token
    从零开始配置 vim(15)——状态栏配置
  • 原文地址:https://blog.csdn.net/weixin_52222660/article/details/130836784