IO:输入输出。
在Java中,一般谈到文件,都是指一个存储在磁盘上的文件(狭义的文件)
如果抛开Java,站在系统的角度来看,操作系统在管理很多软件资源和硬件设备的时候,都是把这些东西抽象成一个一个的文件(这是系统中典型的"一切皆文件" 的思想.这样做带来的一个好处就是会比较方便,由于系统要管理的东西很多,就把内核里面的很多资源都抽象成文件了.比如:显示器、键盘、打印机、网卡.....抽象成文件了.从键盘上读取一个数据,这个代码就跟从文件里面读取一个数据是一样的.要把一个数据输出到显示器上,也相当于写文件一样)
Java里讨论的文件主要还是局限于磁盘上的普通文件 .
狭义的文件,可以分成两个大类:
1.普通文件
2.目录文件(就是文件夹,目录也就是视为是一个一个的文件,只不过它是一个目录文件)
每一个都相当于是一个目录,目录点开又可以看到里面包含很多文件
Java中为了方便我们操作文件,标准库给出了一个Fire类.通过Fire类就把文件的很多操作给封装起来了.
因此就可以通过Fire类来进行操作.
Fire类
常见属性、构造方法、方法
File(String pathname)构造方法:
需要给Fire传递一个具体的路径。
通过这个路径来指定唯一的一个文件(文件可能是一个普通文件,也可能是一个目录文件)。
pathname:主要指的是系统用来描述文件位置的一种方式。
D:\Gitee\2022\20220609\.idea(在一台主机上,一个文件对应这唯一的路径,通过这个路径就可以确定这个文件)。
pathSeparator:路径中间的分割标记
此处的\就是在分割不同层级的目录。
在windows上既可以是使用 \(反斜杠) 作为目录的分隔符,也可以使用 / (斜杠)来分割
在Linux、Mac使用 / 来作为路径之间的分隔符。
在实际开发中,表示一个路径,通常有两种方式:
1.绝对路径。
以一个盘符(D:)开头的路径,这就是绝对路径
2.相对路径。
一般是以 . 或者 .. 开头。(有一个基准目录(工作目录),以工作目录为基准,去找到对应的路径)。
举例:
如果以
为基准目录,此时要表示
相对路径就可以写作 .\TestJDBC.java。
. 就表示当前的基准目录。
如果基准的目录不一样,相对路径的写法,也会不一样。
假设
作为基准目录。
此时还是要表示
这个文件。
相对路径就可以写作 .\src\TestJDBC.java
再举例:
作为基准目录。
此时表示
相对路径就可以写作 ..\TestJDBC.java
.. 就表示当前目录的上级目录
创建文件:
public static void main(String[] args) { //在指定路径的时候,虽然系统支持 \ 的写法,但是由于在 java 中, \ + 其他字符,会被当成转义字符 //因此需要对 \ 进行转移 File file = new File("d:\\test.txt");//相当于通过绝对路径来指定了一个具体的文件,此时就构造出了一个文件对象 }
文件操作:
String getParent() 返回 File 对象的父目录文件路径
String getName() 返回 FIle 对象的纯文件名称
String getPath() 返回 File 对象的文件路径
String getAbsolutePath() 返回 File 对象的绝对路径
String getCanonicalPath() 返回 File 对象的修饰过的绝对路径
boolean exists() 判断 File 对象描述的文件是否真实存在
boolean isDirectory() 判断 File 对象代表的文件是否是一个目录
boolean isFile() 判断 File 对象代表的文件是否是一个普通文件
boolean createNewFile() 根据 File 对象,自动创建一个空文件。成功创建后返 回 true boolean delete() 根据 File 对象,删除该文件。成功删除后返回 true
void deleteOnExit() 根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行
String[] list() 返回 File 对象代表的目录下的所有文件名
File[] listFiles() 返回 File 对象代表的目录下的所有文件,以 File 对象表示
boolean mkdir() 创建 File 对象代表的目录
boolean mkdirs() 创建 File 对象代表的目录,如果必要,会创建中间目录
boolean renameTo(File dest) 进行文件改名,也可以视为我们平时的剪切、粘贴操作 boolean canRead() 判断用户是否对文件有可读权限
在进行一些访问IO操作,比如读写文件,操作文件的时候,都可能涉及到这个异常。
这个异常是一个受查异常。
在使用的时候一定要显示处理:
1. throws 在函数这里声明。
2.try catch来显示捕获。
import java.io.File; import java.io.IOException; /** * Created with IntelliJ IDEA. * Description: * User: 灯泡和大白 * Date: 2022-07-21 * Time: 21:40 */ public class TestFire { public static void main(String[] args) throws IOException { //换成相对路径 File file = new File(".\\.\\.\\test.txt"); System.out.println(file.getParent());//获取到当前文件所在的父目录 System.out.println(file.getName());//获取到当前文件的文件名 System.out.println(file.getPath());//参数传的是什么得到的就是什么 System.out.println(file.getAbsolutePath());//获取到绝对路径 System.out.println(file.getCanonicalPath());//获取到绝对路径(删掉多余的地方) } }
打印结果
在windows上默认是使用 \ 作为目录之间的分隔符的。
虽然windows也支持 / 但是在代码内部一般都是用 \ 来表示。
如果是在IDEA中,我们直接运行一个程序,此时的工作目录,就是当前项目的目录。
在代码中涉及到的相对路径,其实也就是以这个当前项目所在的目录为基准。
代码除了在IDEA中,也可以直接通过命令行来运行。
如果通过命令行运行,当前命令行所在的目录,就是工作路径。
打开CMD的效果,这就是当前命令行里面的当前路径
public static void main(String[] args) { //既没有盘符,也没有 ./ 和 ../的,这个也是相对路径 //相当于省略了 ./ File file = new File("hello.txt"); System.out.println(file.exists());//判断文件存在不存在 }
打印结果:
创建一个hello.txt文件
此时再打印:
public static void main(String[] args) { //既没有盘符,也没有 ./ 和 ../的,这个也是相对路径 //相当于省略了 ./ File file = new File("hello.txt"); //System.out.println(file.exists());//判断文件存在不存在 System.out.println(file.isFile());//判断是不是文件 System.out.println(file.isDirectory());//判断是不是目录 }
打印结果:
public static void main(String[] args) { //既没有盘符,也没有 ./ 和 ../的,这个也是相对路径 //相当于省略了 ./ File file = new File("d:/"); //System.out.println(file.exists());//判断文件存在不存在 System.out.println(file.isFile());//判断是不是文件 System.out.println(file.isDirectory());//判断是不是目录 }
打印结果:
创建文件为什么会抛异常?
也就意味着,文件的创建会失败。
为什么么会失败?
最典型的理由,没有权限。
其他的常见可能,磁盘空间不够了。
文件系统中的权限,典型的就是读和写。
会针对不同的用户给与不同的权限。
ublic static void main(String[] args) throws IOException, InterruptedException { File file = new File("hello.txt"); file.createNewFile(); System.out.println("文件创建成功"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } file.deleteOnExit();//退出程序的时候再删除 System.out.println("把文件标记成功退出删除的状态"); Thread.sleep(3000); }
file.deleteOnExit();
主要用于一些"临时文件"。
使用world或者Excel之类的,打开文件的时候,系统会同时生成一个临时的隐藏文件
ublic static void main(String[] args) throws IOException { File file = new File("."); file.createNewFile(); String[] files = file.list(); System.out.println(Arrays.toString(files)); }
打印结果:
一道典型的面试题:
给你一个list方法,如何实现,遍历一个目录中所有的文件(包含子目录中的文件)。
/通过递归的方式,来罗列出指定目录中所有的文件路径 public class FileDOome2 { public static List<String> result = new ArrayList<>(); public static void getAllFile(String basePath){ File file = new File(basePath); if(file.isFile()){ result.add(basePath); return; }else if(file.isDirectory()){ String[] files = file.list(); for (String f: files) { getAllFile(basePath + "/" + f); } }else{ //当前文件既不是普通文件,也不是目录,这个情况暂时不考虑 //这样的文件确实存在(socket 文件,管道文件,设备块文件.....) } } public static void main(String[] args) { getAllFile("."); for (String s: result) { System.out.println(s); } } }
打印结果: