目录
一、文件的概念
二、文件的目录(directory)
三、文件路径(Path)
四、文件的分类
五、文件的操作
1.文件系统的操作
1.1创建文件--createNewFile( )
1.2删除文件--delete( ) 和 deleteOnExit( )
1.3文件改名--renameTo(File dest)
1.4创建目录--mkdir( ) 和 mkdirs( )
1.5打印目录下的文件列表--list( ) 和 listFiles( )
1.6判断文件操作权限--canRead( ) 和 canWrite( )
说到文件,大家一定耳熟能详。比如,.pdf,.java,.jpg等等都是文件。
狭义上的文件(file),包括文件元信息和文件内容两部分。
文件元信息就是文件的名称、类型等等。如下图所示,即为文件的元信息。
广义上的文件,比如我们的鼠标、显示器等等。
“万物皆文件”--很多操作系统为了实现接口的统一性,将所有的I/O设备都抽象成了文件的概念,使用这一理念最为知名的就是 Unix、Linux 操作系统。
文件的目录依旧是文件。在Windows和Linux系统中文件都是按照树形结构进行组织。不同的是,在Windows中是以文件夹的形式展示,而在Linux中是树的形式。
目录类似于N叉树,即结点下面有N个结点,最后一级为叶子结点,如图所示:
文件路径有两种:绝对路径和相对路径。
绝对路径(absolute path):从盘符开始,描述这个文件的路径就是绝对路径。例如,F:/test/hello.txt
相对路径(relative path):相对于某个文件的路径。这里的某个文件即为基准文件,基准文件的路径就是基准路径。相对路径一定有基准路径。
举一个生活中的例子来看,如果一个地点的绝对路径为:陕西省西安市雁塔区**路**号,即为绝对地址,无论处于中国那个地方都可以根据这个地址找到这个地点;而相对路径就是已经到达了陕西省西安市雁塔区,此时陕西省西安市雁塔区就是基准路径,**路*号就是相对路径。
相对路径中表示当前目录使用 . 表示当前目录的父目录使用 ..
我们在N叉树中来练习一下如何描述相对路径和绝对路径:
此时,dd 文件的绝对路径即为: F:/a/dd
dd文件相对于a文件的相对路径为:./dd(此时已经位于a文件所在位置,因此直接进入dd文件即可)
dd文件相对于aa文件的相对路径为:../dd(此时位于aa文件所在位置,要进入dd文件需要先返回至父目录(a),然后进入dd文件)
dd文件相对于b文件的相对路径为:../a/dd(此时位于b文件所在位置,要进入dd文件需要先返回至父目录(F盘),再进入a文件最后进入dd文件)
文件分为文本文件和二进制文件。我们如何区分文本文件和二进制文件呢?---使用记事本打开文件。如果出现乱码,则为二进制文件(doc文件、pdf文件、jpg文件等);如果可以正常打开,则为文本文件(java文件、c文件、txt文件等)。
文本文件:相邻的字节正好组成一个字符。文本文件是一种特殊的二进制文件。
每一个文件对象都对应一个file(jdk提供)文件,类似于每一个线程都对应一个Thread类。
一个File对象并不表示这个文件就存在。通过以下链接我们来学习java文件操作相关的API。
Overview (Java Platform SE 8 ) (oracle.com)
选择java.io->File,打开如下图所示:
那么以上具体是什么呢?
我们在jdk中打印观察输出如下图所示:
输出为 ;是因为 pathSeparator 是路径分隔符,当有多个路径时使用分号隔开,在配置环境变量时以分号分隔,如下图所示:
输出为 / 是因为文件路径,比如:F:\temp\aa.txt 就是以反斜杠分隔的。
其他两个也是同样的。
创建构造方法:
构造函数的三种方法:
File file = new File("F:/temp/aa.txt");
File file1 = new File("F:temp","aa.txt");
File file2 = new File(new File("F:/temp"),"aa.txt");
以上三种方法,指的是同一个文件。
当我们new了一个文件后,输入文件的绝对路径,发现报错,是什么原因导致的呢?---\t 是转义字符(制表符),因此有歧义,所以此处报错。我们可以通过以下两种方式进行修改:
方法一:
public class Demo_1 {
public static void main(String[] args) {
File file = new File("F:\\temp\\aa.txt");
}
}
方法二:
public class Demo_1 {
public static void main(String[] args) {
File file = new File("F:/temp/aa.txt");
}
}
此时file文件并不存在,但是我们仍旧可以对文件进行相关操作。
对于以上五种方法,我们实际应用后得到以下结果:
根据以上两组代码的演示,可以得到以下结论:
getName 方法:返回 File 对象的文件名称;
getParent 方法:返回 File 对象的父目录文件路径;
getPath 方法:根据 File 对象使用的路径,返回相对应的路径(相对/绝对路径);
getAbsolutePath 方法:返回没有简化的绝对路径,点点前面的是基准路径(当前项目的路径),点点后面的是相对路径。
getCanonicalPath 方法:(需要抛出异常)返回简化后的绝对路径。
public class Demo_2 {
public static void main(String[] args) {
File file = new File("F:/temp/cc.txt");
// 判断文件是否存在
System.out.println(file.exists()); // false
// 判断文件是否是目录
System.out.println(file.isDirectory()); // false
// 判断文件是否普通文件
System.out.println(file.isFile()); // false
}
}
因为 cc.txt 文件并不存在,因此以上结果均为 false。 此时,我们在 F:/temp 路径下创建 hello.txt 文件:
运行以下代码:
public class Demo_2 {
public static void main(String[] args) {
File file = new File("F:/temp/cc.txt");
file = new File("F:/temp/hello.txt");
// 判断文件是否存在
System.out.println(file.exists()); // true
// 判断文件是否是目录
System.out.println(file.isDirectory()); // false
// 判断文件是否普通文件
System.out.println(file.isFile()); // true
}
}
项目开发中,使用的是相对路径。为什么不使用更加具体的绝对路径呢?
绝对路径在服务器中并没有盘符等相关资源。
在执行代码前:
执行以下代码:
public class Demo_3 {
public static void main(String[] args) throws IOException {
File file = new File("F:/temp/aa.txt");
// 如果文件不存在,则创建文件
if(!file.exists()){
file.createNewFile();
}
}
}
执行以上代码后:
此时,文件创建完毕。
删除文件有两种方法:
返回值类型 | 方法名 | 解释 |
boolean | delete() | 根据 File 对象,删除文件,删除成功返回 true |
void | deleteOnExit() | 根据 File 对象,标注文件将会被删除,删除动作会到 JVM 运行结束后才执行 |
delete 方法:
在执行代码前:
执行以下代码:
public class DeleteDemo {
public static void main(String[] args) {
File file = new File("F:/temp/aa.txt");
// 如果文件存在,则删除文件,打印文件是否存在
if(file.exists()){
file.delete();
System.out.println(file.exists());
}
}
}
执行代码后:
deleteOnExit 方法:(一般用于删除临时文件)
在执行代码前:
执行以下代码:
public class DeleteDemo {
public static void main(String[] args) {
File file = new File("F:/temp/aa.txt");
// 如果文件存在,则删除文件,打印文件是否存在
if(file.exists()){
file.deleteOnExit();
System.out.println(file.exists());
}
}
}
执行代码后:
在项目中,一般不会轻易删除文件。而且文件并不会被真的删除,而是在磁盘中标注为“废弃”。删除文件的功能一般用于删除脏数据。
返回值类型 | 方法名 | 解释 |
boolean | renameTo() | 文件改名,包含了文件的重命名,可以理解为剪切 |
// 重命名文件 -- 剪切
File file4 = new File("F:/temp/hello.txt");
file4.renameTo(new File("F:/temp/ee/ff/hello_1.txt"));
可以看到执行以上代码后,原本绝对路径为: F:/temp/hello.txt 的文件已经不在了。
而是位于 F:/temp/ee/ff/hello_1.txt :
返回值类型 | 方法名 | 解释 |
boolean | mkdir() | 创建 File 对象代表的目录 |
boolean | mkdirs() | 创建 File 对象代表的目录,如果必要,会创建中间目录 |
也就是说, mkdir() 不能创建多层目录;mkdirs() 可以创建级联目录。
// 创建一个目录 ee
File file1 = new File("F:/temp/ee");
file1.mkdir();
// 创建多级目录
File file2 = new File("F:/temp/ee/ff");
file2.mkdir();
返回值类型 | 方法名 | 解释 |
String[ ] | list() | 返回 File 对象代表的目录下的所有文件名 |
File[ ] | listFiles() | 返回 File 对象代表的目录下的左右文件名,以 File 对象表示。 |
list( ) 方法:
执行代码前:
执行代码后:
listFiles( ) 方法:
执行代码后:
返回值类型 | 方法名 | 解释 |
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
修改文件权限为只读,运行结果如下:
关于Java中的操作文件就先总结到这里~