文件:文件是一个广义的概念
- 在操作系统中文件可以指硬件资源和软件资源为文件;
- 也可以指存储在硬盘上的文件,文件夹也是文件;文件夹是通俗的叫法,专业的叫法是目录;
查看我们的硬盘,我们可以发现文件在硬盘上的存储结构是树型的存储结构,文件夹里可以由文件夹和文件,文件夹里又可以继续嵌套文件和文件夹,不难发现是一个树型结构,n叉树;
此电脑 就是树的根;
路径
有这么多文件,如何去找到,确定我们要找的文件?文件系统为我们提供了 路径;路径可以分为绝对路径和相对路径;
- 绝对路径:从盘符开始,一直到文件的路径就是绝对路径;
- 相对路径:从当前的目录开始(工作目录),直到文件的路径就是相对路径;
有人要问,那为什么我们平常看到的路径为什么都是从盘符开始的,而不是此电脑开始的呢?
- 这是因为所有的文件都是此电脑开始的,所以文件系统省略了此电脑作为路径;
D:\WeChat\WeChat.exe 这就是绝对路径,从盘符开始
如果当前的路径是D:\WeChat,那么WeChat.exe 的相对路径就是 ./WeChat.exe
还有另外一种情况,我们当前进入了Wechat里的另一个文件夹,当前的目录是D:\WeChat\aaa,那我们如何确定WeChat.exe呢? ../WeChat.exe就是了
相对路径的一些注意点:
- 相对路径中, ..表示上一级目录,.表示当前目录;
- 相对路径还可以是任意路径;
- 相对路径开头的./可以去掉,但是不建议去掉;
细心的应该有看到我上面表示路径的分隔符有用到正斜杠 / 和反斜杠 \ ,那是因为什么呢?
- 这就不得不说到微软在开发DOS的时候了,当时市面上主流还是Unix系统,而Unix系统就是用正斜杠来当作分隔符的,刚开始微软也是想用的,但是在发布之际就改成反斜杠,发布之后受到了很多反对,后面就改成了正反斜杆都支持,所以如今能够在微软的操作系统中正反斜杆都能够使用,当然在编写代码的时候,还是建议养成使用正斜杠的习惯,因为使用反斜杠,你还得用再加一个反斜杠,防止和其他字符变成其他转义字符。
文件的操作
文件按照不同的分类可以分为很多种类,这里主要讲跟编写代码相关的,分为文本文件和二进制文件;
从存储的内容来看,文本文件存的是合法的字符,而二进制文件存的可以是任何内容,像照片,视频,音乐......;
一个最简单粗暴的分辨办法,打开记事本,讲文件拖入记事本打开,如果不是乱码,就是文本文件,如果是乱码,就是二进制文件;
这是打开一个应用程序,乱码,二进制文件;
Java操作文件使用File这个类,这个类来自 java.io包,跟io有关;下面主要分享这个包中用到的主要构造方法和方法;
构造方法
File(String pathname) | 一个字符串作为路径,可以是绝对路径也可以是相对路径 |
File(String parent, String child) | 一个字符串作为父目录,一个字符串作为子目录,合起来是一个文件的路径 |
File(File parent, String child) | 一个文件变量和一个字符串合起来的一个文件路径 |
构造方法中最常用的第一个,最直接明了,可以是绝对路径也可以是相对路径,如果是相对路径,你要明确自己的当前目录(工作目录);
方法
返回值的类型 | 方法签名 | 说明 |
String | getName() | 返会File对象的纯文件名 |
Stringe | getParent() | 返回表示File对象的父目录的字符串 |
String | getPath() | 返回表示File对象完整路劲的字符串 |
String | getAbsolutePath() | 返回File对象的绝对路径 |
String | getCanonicalPath() | 返回File对象修饰过的绝对路径 |
boolean | exists() | 判断File对象是否真实存在 |
boolean | isDirectory() | 判断File对象是不是一个目录 |
boolean | isFile() | 判断File对象是不是一个普通文件 |
boolean | createNewFile() | 根据File对象创建一个空文件,创建成功返回true,存在返回false; |
boolean | delete() | 根据File对象删除该文件 |
void | deleteOnExit() | 根据File对象标记该文件要删除,直到该程序结束就会删除该文件 |
String[] | list() | 返回目录下所有文件的文件名 |
File[] | listFiles() | 返回该目录下的所有文件的文件名,以File对象返回 |
boolean | mkdir() | 创建File对象表示的目录 |
boolean | mkdirs() | 创建File对象表示的目录,即使是可能要连续创建多个目录 |
boolean | renameTo(File dest) | 根据File对象重新以dest命名,相当于创建,复制,删除为一体; |
boolean | canRead() | 判断该用户有没有可以读这个文件的权限 |
boolean | canWrite() | 判断该用户有没有可以写这个文件的权 |
代码演示
打开文件
对于File对象用绝对路径来说,无论是哪种获取获取的方法,都是一样的;
当时对于用相对路径表示,就会有所不同了;
这是我当前的工作目录:
可以看到获取路径的方法返回的都是以相对路径判断的,以获取修饰过的字符串就是会把无所谓的./去掉;
值得一提的是上面的路径代表的文件无论是否真实,即使文件不存在也会根据你提供的路径返回值;
操作文件的主要方法
新建文件,删除文件,修改文件名字,查找文件.....,只是介绍我认为需要注意的,简单的不做多赘述;
listFiles()
返回指定File文件下所有文件的文件名(完整路径),不包括目录里面的文件;像src目录里面还有很多文件;
如果File对象不存在,会报错;
createNewFile()
创建文件;
说明: 由于第三个代码报错,我重新测试了第四个代码,依旧是报一样的错误,说明创建文件不能额跨未创建的目录去创建文件;根据查看创建的文件可以看到,只能创建普通文件,不能创建文件夹,已经存在相同的文件,会返回一个false;
deleteOnExit()
根据File对象,标注⽂件将被删除,删除动作会到JVM运⾏结束时才会进行
说明:在等待jvm结束的过程中,观察该文件依旧存在,直到jvm结束,该文件才被删除;
mkdir()
注意:硬盘不提前创建相关的文件文件夹,除了必要用到的工作目录;
观察不难看出,mkdir最多只能创建一个目录,超过一个不会创建,且不管你的File对象的文件夹名字会不会是一个普通文件;
mkdirs()
该方法与mkdir唯一不同的就是它可以创建超过一个文件夹,还是相同代码(上面代码创建的文件已经删除)
区别一目了然,mkdirs无论需要创建多少级目录,都是能够创建成功的;