前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java 基础(三)| IO流之使用 File 类的正确姿势

Java 基础(三)| IO流之使用 File 类的正确姿势

作者头像
JavaFish
发布于 2020-01-14 07:04:30
发布于 2020-01-14 07:04:30
85300
代码可运行
举报
运行总次数:0
代码可运行

为跳槽面试做准备,今天开始进入 Java 基础的复习。希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆。

一、什么是 File 类?

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。

二、File 类的使用

2.1 构造方法

File 类的构造有三种:

  • public File(String pathname) : 直接通过文件路径字符串创建
  • public File(String parent, String child) : 通过父和子路径字符串创建
  • public File(File parent, String child) : 先创建父级 file 对象,再结合子路径创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Project Name:review_java <br/>
 * Package Name:com.nasus.io.file <br/>
 * Date:2020/1/3 22:22 <br/>
 *
 * @author <a href="turodog@foxmail.com">chenzy</a><br/>
 */
public class FileConstruct {

    public static void  main(String [] args) {
        // 文件路径名
        String pathname = "Z:\\file\\file.txt";
        File file1 = new File(pathname);
        System.out.println(file1);

        // 通过父路径和子路径字符串
        String parent = "Z:\\file";
        String child1 = "file.txt";
        File file2 = new File(parent, child1);
        System.out.println(file2);

        // 通过父级 File 对象和子路径字符串
        File parentDir = new File("Z:\\file");
        String child2 = "file.txt";
        File file3 = new File(parentDir, child2);
        System.out.println(file3);
    }

}

三种创建 File 对象的方法如上所示,此外需要说明的是:一个 File 对象代表硬盘中的目录或者文件,而这个目录或文件在硬盘中是否存在不影响 File 对象的创建。

2.2 获取功能的方法

  • public String getAbsolutePath() :返回指定 File 实例的绝对路径
  • public String getPath() :将指定 File 实例的抽象路径名转换为一个路径名字符串
  • public String getName() :返回指定 File 实例的目录或文件名
  • public long length() :返回指定 File 实例的文件长度

在硬盘 Z:\file 下,新建一个 file.txt 文件,文件内容是 26 个英文字母。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Project Name:review_java <br/>
 * Package Name:com.nasus.io.file <br/>
 * Date:2020/1/4 11:01 <br/>
 *
 * @author <a href="turodog@foxmail.com">chenzy</a><br/>
 */
public class FileGet {

    public static void main(String[] args) {

        File file1 = new File("Z:"+ File.separator + "file" + File.separator + "file.txt");
        System.out.println("文件绝对路径:"+file1.getAbsolutePath());
        System.out.println("文件构造路径:"+file1.getPath());
        System.out.println("文件名称:"+file1.getName());
        System.out.println("文件长度:"+file1.length()+"字节");

        System.out.println("----------------------");

        // 表示根目录,  在 windows 下:File.separator + "file" = "\\file"
        File file2 = new File(File.separator + "file");
        // 绝对路径
        System.out.println("目录绝对路径:"+file2.getAbsolutePath());
        // 构造 File 实例时的路径
        System.out.println("目录构造路径:"+file2.getPath());
        System.out.println("目录名称:"+file2.getName());
        // file 示例为目录,所以长度 = 0
        System.out.println("目录长度:"+file2.length());
    }

}

File 的 get 方法如上示例,值得注意的是:getPath () 与 getAbsolutePath () 的区别在于,前者获取的是构造 File 实例时的路径,后者获取的是 File 实例的绝对路径。当构造 File 实例的路径也是绝对路径时,二者是一样的。

2.3 绝对路径与相对路径

  • 绝对路径:从盘符开始的完整路径
  • 相对路径:相对于你当前的项目目录的路径,在开发中常用此路径
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Project Name:review_java <br/>
 * Package Name:com.nasus.io.file <br/>
 * Date:2020/1/4 11:29 <br/>
 *
 * @author <a href="turodog@foxmail.com">chenzy</a><br/>
 */
public class FilePath {

    public static void main(String[] args) {
        // Z盘下的 file.txt 文件
        File file = new File("Z:\\file.txt");
        System.out.println(file.getAbsolutePath());

        // 项目下的 file.txt 文件
        File file2 = new File("file.txt");
        System.out.println(file2.getAbsolutePath());
    }

}

输出结果:
Z:\file.txt
Z:\IDEAProject\review\review_java\file.txt

2.4 判断功能的方法

判断功能的方法主要有三个,输出都是布尔值:

  • public boolean exists() :指定 File 实例代表的文件或者目录是否存在
  • public boolean isDirectory() :指定 File 实例是不是目录
  • public boolean isFile() :指定 File 实例是不是文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Project Name:review_java <br/>
 * Package Name:com.nasus.io.file <br/>
 * Date:2020/1/4 11:37 <br/>
 *
 * @author <a href="turodog@foxmail.com">chenzy</a><br/>
 */
public class FileIs {

    public static void main(String[] args) {
        File file1 = new File("Z:\\file\\file.txt");
        File file2 = new File("Z:\\file");
        // 判断是否存在
        System.out.println("Z:\\file\\file.txt 是否存在:"+file1.exists());
        System.out.println("Z:\\file 是否存在:"+file2.exists());
        // 判断文件
        System.out.println("Z:\\file\\file.txt 文件?:"+file1.isFile());
        System.out.println("Z:\\file 文件?:"+file2.isFile());
        // 判断目录
        System.out.println("Z:\\file\\file.txt 目录?:"+file1.isDirectory());
        System.out.println("Z:\\file 目录?:"+file2.isDirectory());
    }

}

输出结果:
Z:\file\file.txt 是否存在:true
Z:\file 是否存在:true
Z:\file\file.txt 文件?:true
Z:\file 文件?:false
Z:\file\file.txt 目录?:false
Z:\file 目录?:true

2.5 创建与删除方法

  • public boolean createNewFile() :指定 File 实例的文件不存在时,创建空文件
  • public boolean delete() :删除指定 File 实例表示的文件或目录
  • public boolean mkdir() :创建指定 File 实例表示的目录
  • public boolean mkdirs() :创建指定 File 实例表示的目录,以及父目录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Project Name:review_java <br/>
 * Package Name:com.nasus.io.file <br/>
 * Date:2020/1/4 11:49 <br/>
 *
 * @author <a href="turodog@foxmail.com">chenzy</a><br/>
 */
public class FileCreateDelete {

    public static void main(String[] args) throws IOException {
        System.out.println("-----创建文件------");
        // 文件的创建
        File file1 = new File("file1.txt");
        System.out.println("是否存在:"+file1.exists()); // false
        System.out.println("是否创建:"+file1.createNewFile()); // true
        System.out.println("是否存在:"+file1.exists()); // true

        System.out.println("-----创建目录------");

        // 目录的创建
        File file2 = new File("fileDir");
        System.out.println("是否存在:"+ file2.exists());// false
        System.out.println("是否创建:"+ file2.mkdir());	// true
        System.out.println("是否存在:"+ file2.exists());// true

        System.out.println("-----创建多级目录------");

        // 创建多级目录
        File file3= new File("fileDir1\\fileDir2");
        System.out.println(file3.mkdir());// false
        File file4 = new File("fileDir1\\fileDir2");
        System.out.println(file4.mkdirs());// true

        System.out.println("-----删除文件------");

        // 文件的删除
        System.out.println(file1.delete());// true

        System.out.println("-----删除目录------");
        
        // 目录的删除
        System.out.println(file2.delete());// true
        System.out.println(file4.delete());// false
    }

}

2.6 目录的遍历

  • public String[] list() :返回一个 String 数组,表示指定 File 实例目录中的所有子文件或目录。
  • public File[] listFiles() :返回一个 File 数组,表示指定 File 实例目录中的所有的子文件或目录。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Project Name:review_java <br/>
 * Package Name:com.nasus.io.file <br/>
 * Date:2020/1/4 12:02 <br/>
 *
 * @author <a href="turodog@foxmail.com">chenzy</a><br/>
 */
public class FileList {

    public static void main(String[] args) {
        File dir = new File("Z:\\IDEAProject");

        //获取当前目录下的文件以及文件夹的名称,用处不大。
        String[] names = dir.list();
        for(String name : names) {
            System.out.println(name);
        }
        System.out.println("--------------------------------");
        //获取当前目录下的文件以及文件夹对象,拿到了文件对象,可以做更多操作,项目常用
        File[] files = dir.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }

}

值得注意的是:不管是 list () 还是 listFiles () 方法,所指定的 File 实例都必须是在硬盘中实际存在的,否则无法遍历。

三、递归

3.1 什么是递归?

指的是程序在某个方法内自己调用自己的操作。

3.2 递归的分类

递归分为两种:

  • 直接递归:称为方法自身调用自己。
  • 间接递归:可以 A 方法调用 B 方法,B 方法调用 C 方法,C 方法调用 A 方法。

3.3 递归的使用规范

  • 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
  • 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出
  • 构造方法,禁止递归

四、递归的使用

如果你不知道什么时候使用递归?那这里有一条很简单的定律:当你明确递归次数不至于造成内存溢出是,可使用;否则,不要使用。

递归有很多的使用场景,比如递归求和,递归阶乘。而递归多级目录、遍历文件、搜索文件是我们在开发中常用的,它是这么实现的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Project Name:review_java <br/>
 * Package Name:com.nasus.io.file <br/>
 * Date:2020/1/4 12:15 <br/>
 *
 * @author <a href="turodog@foxmail.com">chenzy</a><br/>
 */
public class FileSearch {

    public static void main(String[] args) {
        // 创建 File 对象
        File dir  = new File("Z:\\IDEAProject");
        // 调用文件搜索方法
        searchFile(dir);
    }

    public static void  searchFile(File dir) {
        // 获取子文件和目录
        File[] files = dir.listFiles();
        // 循环遍历
        for (File file : files) {
            // 判断
            if (file.isFile()) {
                // 输出查找的目标文件的绝对路径
                if ("FileIs.java".equals(file.getName())){
                    System.out.println("目标文件路径:"+ file.getAbsolutePath());
                }
            } else {
                // 是目录,调用自身,形成递归
                searchFile(file);
            }
        }
    }

}

输出结果:
目标文件路径:Z:\IDEAProject\review\review_java\src\main\java\com\nasus\io\file\FileIs.java

五、Github 源码地址

文章出现的所有代码都上传到我的 Github 了,觉得不错。给个 Star 呗

  • Github 源码地址:https://github.com/turoDog/review_java/tree/master/src/main/java/com/nasus/file

-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个优秀的废人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python 编辑框 text
print('PP4E scrolledtext') from tkinter import *
用户5760343
2022/05/13
8930
python 编辑框 text
python tkinter(2)
1、设置label的字体、颜色、背景色、宽、高 from tkinter import * root = Tk() labelfont = ('times', 20, 'bold') # family, size, style widget = Label(root, text='Hello config world') widget.config(bg='black', fg='yellow') # yellow text on black label widget.config(font=labelfont) # use a larger font widget.config(height=3, width=20) # initial size: lines,chars widget.pack(expand=YES, fill=BOTH) root.mainloop() 2、bd设置边框、relief=设置边框类型,cursor鼠标
用户5760343
2022/05/13
8100
python tkinter(2)
python textEditor 自制编辑器
""" ############################################################################### An extended Frame that makes window menus and toolbars automatically. Use GuiMakerFrameMenu for embedded components (makes frame-based menus). Use GuiMakerWindowMenu for top-level windows (makes Tk8.0 window menus). See the self-test code (and PyEdit) for an example layout tree format. ############################################################################### """
用户5760343
2022/05/13
1.3K0
python textEditor 自制编辑器
python tkinter pil 缩略图 脚本
""" display all images in a directory as thumbnail image buttons that display the full image when clicked; requires PIL for JPEGs and thumbnail image creation; to do: add scrolling if too many thumbs for window! """
用户5760343
2022/05/13
4120
Python实现计算机屏幕任意区域截图
程序功能与用法:运行后有个主窗体,上面有个按钮,单击后开始截图,鼠标坐标落下开始截图,鼠标左键抬起表示截图结束,然后弹出对话框提示保存截图文件。 本文要点在于Python扩展库pillow提供的ImageGrab支持全屏幕或指定区域的截图。 import tkinter import tkinter.filedialog import os from PIL import ImageGrab from time import sleep #创建tkinter主窗口 root = tkinter.Tk() #
Python小屋屋主
2018/04/16
6.1K0
python canvas 拖拽和移动\事件
""" draw elastic shapes on a canvas on drag, move on right click; see canvasDraw_tags*.py for extensions with tags and animation """
用户5760343
2022/05/13
9910
python canvas 拖拽和移动\事件
python pyphoto图片查看器
""" ############################################################################ PyPhoto 1.1: thumbnail image viewer with resizing and saves.
用户5760343
2022/05/13
1.3K0
python pyphoto图片查看器
python tkinter
1、 from tkinter import Label widget=Label(None,text='Hello Gui') widget.pack() widget.mainloop() 2| expand fill:组件随窗口调整大小 from tkinter import * widget=Label(None,text='Hello Gui') widget.pack(expand=YES,fill=BOTH) widget.mainloop()
用户5760343
2022/05/13
1.3K0
python tkinter
Python实现屏幕取色器功能
代码主要思路:首先获取全屏幕截图,在截取的图像上获取指定位置的像素颜色值并转换为十六进制表示形式。 遗憾之处:这个程序的部分代码比较长,在手机上查看时这些换行可能会影响阅读质量,记得之前有个朋友提过建议让我加上代码块,不过我试了试,微信公众号后台的编辑器不支持这个功能,网上找了几个编辑器也不太好用。如果有朋友知道简单易用的支持代码块的编辑器还请推荐一下,谢谢! import os from time import sleep import tkinter import tkinter.filedialog
Python小屋屋主
2018/04/17
7.8K3
Python+tkinter+pillow实现屏幕任意区域截图
基本思路:首先获取并显示全屏幕截图,然后在全屏幕截图上响应鼠标左键按下和抬起事件,最后进行二次截图。 import tkinter import tkinter.filedialog import os from PIL import ImageGrab from time import sleep root = tkinter.Tk() #设置窗口大小与位置 root.geometry('100x40+400+300') #设置窗口大小不可改变 root.resizable(False, False) #
Python小屋屋主
2018/04/16
8K3
python 动态GUI表单生成器 脚本***
""" ################################################################## a reusable form class, used by getfilegui (and others) ################################################################## """
用户5760343
2022/05/13
6520
python 动态GUI表单生成器 脚本***
精选了20个Python实战项目(附源码),拿走就用!
Python是目前最好的编程语言之一。由于其可读性和对初学者的友好性,已被广泛使用。
小F
2021/12/21
3.8K0
精选了20个Python实战项目(附源码),拿走就用!
python 简易编辑器 text
print('PP4E scrolledtext') from tkinter import *
用户5760343
2022/05/13
4360
python 简易编辑器 text
【工具】旋转图片-数据集制作工具, 开源!
        之前做了一个下载百度的旋转图片验证码的工具(多进程下载百度旋转验证码图片-制作数据集),那么拿到了图片数据,就需要手动校正调整来制作数据集,所以出了这个工具。
小锋学长生活大爆炸
2023/11/09
2481
【工具】旋转图片-数据集制作工具, 开源!
用python对图片批量压缩和格式转换
python作为简单、易学的编程语言,上手入门要容易许多。如果数据分析、机器学习、人工智能这些对你来说比较遥远,用python写一点实用的小脚本帮你解决问题、提高办公效率也是不错的。
快学Python
2021/08/09
6540
项目展示:像素化图片生成器
https://cloud.tencent.com/developer/article/2465647?shareByChannel=link
小说男主
2024/11/25
1851
项目展示:像素化图片生成器
python guimixin 消息调用 工具dialog封装
""" ############################################################################### a "mixin" class for other frames: common methods for canned dialogs, spawning programs, simple text viewers, etc; this class must be mixed with a Frame (or a subclass derived from Frame) for its quit method ############################################################################### """
用户5760343
2022/05/13
3140
有趣的python代码_python五角星代码
天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花庆祝昨晚法国队夺冠,工作之余也可以随时让程序为自己放一场烟花秀。
全栈程序员站长
2022/11/09
1.5K0
有趣的python代码_python五角星代码
Python: 屏幕取色器(识别屏幕上不同位置的颜色)
文章背景:工作中,有时候需要判断图片中不同位置的颜色。有些颜色不太容易区分,所以想通过Python编写代码,通过屏幕取点,获取某个位置的颜色值。
Exploring
2022/09/20
5.1K0
Python:  屏幕取色器(识别屏幕上不同位置的颜色)
​Python | GUI编程之tkinter (一)
本文内容为使用Python3的tkinter模块,开发GUI。在阅读本文前,请确保你已经或可能满足以下条件:
LogicPanda
2019/07/30
6K0
相关推荐
python 编辑框 text
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文