一文带你详细认识文件与Java中操作文件
作者:遇事问春风乄
认识文件
我们先来认识狭义上的文件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息
树型结构组织和目录
同时,随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织 —— 也就是我们数据结构中学习过的树形结构。这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹(folder)或者目录(directory)的概念。
文件路径(Path)
如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)
除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被
称为相对路径(relative path),相对于当前所在结点的一条路径
知识扩展
即使是普通文件,根据其保存数据的不同,也经常被分为不同的类型,我们一般简单的划分为文本文件和二进制文件,分别指代保存被字符集编码的文本和按照标准格式保存的非被字符集编码过的文件。
Windows 操作系统上,会按照文件名中的后缀来确定文件类型以及该类型文件的默认打开程序。但这个习俗并不是通用的,在 OSX、Unix、Linux 等操作系统上,就没有这样的习惯,一般不对文件类型做如此精确地分类。
文件由于被操作系统进行了管理,所以根据不同的用户,会赋予用户不同的对待该文件的权限,一般地可以认为有可读、可写、可执行权限
Windows 操作系统上,还有一类文件比较特殊,就是平时我们看到的快捷方式(shortcut),这种文件只是对真实文件的一种引用而已。其他操作系统上也有类似的概念,例如,软链接(soft link)等
最后,很多操作系统为了实现接口的统一性,将所有的 I/O 设备都抽象成了文件的概念,使用这一理念,最为知名的就是 Unix、Linux 操作系统 —— 万物皆文件
Java 中操作文件
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。
值得注意的是,有 File 对象,并不代表真实存在该文件
File 概述
我们先来看看 File 类中的常见属性、构造方法和方法
属性
修饰符及类型 | 属性 | 说明 |
---|---|---|
static String | pathSeparator | 依赖于系统的路径分隔符,String 类型的表示 |
static char | pathSeparator | 依赖于系统的路径分隔符,char 类型的表示 |
构造方法
签名 | 说明 |
---|---|
File(File parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径 |
File(String parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示 |
方法
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
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(Filedest) | 进行文件改名,也可以视为我们平时的剪切、粘贴操作 |
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
File使用实例代码演示
实例一
观察get系列的特点和差异
代码如下:
import java.io.File; import java.io.IOException; public class IODemo1 { public static void main(String[] args) throws IOException { File file = new File("./遇事问春风乄.txt"); System.out.println(file.getName()); System.out.println(file.getParent()); System.out.println(file.getPath()); System.out.println(file.getAbsolutePath()); System.out.println(file.getCanonicalPath()); } }
注意:有 File 对象,并不代表真实存在该文件
也就是说这里的遇事问春风乄可能根本不存在
运行结果如下:
实例二
普通文件的创建、删除
代码如下:
import java.io.File; import java.io.IOException; public class IOdemo2 { public static void main(String[] args) throws IOException { File file = new File("./遇事问春风乄.txt"); // 要求该文件不存在,才能看到相同的现象 //文件是否存在 System.out.println(file.exists()); //是否是文件目录 System.out.println(file.isDirectory()); //是否为普通文件 System.out.println(file.isFile()); //创建该文件 System.out.println(file.createNewFile()); System.out.println(file.exists()); System.out.println(file.isDirectory()); System.out.println(file.isFile()); //如果有重复,则不会创建。返回false System.out.println(file.createNewFile()); } }
结果如下:
如果你跟博主一样是使用IDEA编译器的话,还可以看到该文件路径下已经产生了该文件
实例三
普通文件的删除
代码如下:
import java.io.File; import java.io.IOException; public class IODemo3 { public static void main(String[] args) throws IOException { File file = new File("./遇事问春风乄.txt"); // 要求该文件不存在,才能看到相同的现象 System.out.println(file.exists()); System.out.println(file.createNewFile()); System.out.println(file.exists()); System.out.println(file.delete()); System.out.println(file.exists()); } }
结果展示:
实例四
观察 deleteOnExit 的现象
我们先来观察以下代码,没有加deleteOnExit
import java.io.File; import java.io.IOException; public class IODemo4 { public static void main(String[] args) throws IOException { File file = new File("./遇事问春风乄.txt"); // 要求该文件不存在,才能看到相同的现象 System.out.println(file.exists()); System.out.println(file.createNewFile()); System.out.println(file.exists()); //file.deleteOnExit(); System.out.println(file.exists()); } }
结果如下:
注意这时候我们是可以看到我们创建了该文件的
当我们加上deleteOnExit后再来看看运行结果
但是呢,当程序运行结束后却观察不到该路径下的该文件。
这就是deleteOnExit方法的效果
实例五
观察目录的创建
import java.io.File; public class IODemo5 { public static void main(String[] args) { File dir = new File("IO-dir"); // 要求该目录不存在,才能看到相同的现象 System.out.println(dir.isDirectory()); System.out.println(dir.isFile()); System.out.println(dir.mkdir()); System.out.println(dir.isDirectory()); System.out.println(dir.isFile()); } }
结果如下:
实例六
观察目录创建2——mkdirs
import javax.swing.*; import java.io.File; public class IODemo5 { public static void main(String[] args) { File dir = new File("./IO-dir/aa/bb"); // 要求所有目录不存在,才能看到相同的现象 System.out.println(dir.isDirectory()); System.out.println(dir.isFile()); System.out.println(dir.mkdir()); System.out.println(dir.isDirectory()); System.out.println(dir.isFile()); } }
运行结果如下:
mkdir() 的时候,如果中间目录不存在,则无法创建成功; mkdirs() 可以解决这个问题。
import javax.swing.*; import java.io.File; public class IODemo5 { public static void main(String[] args) { File dir = new File("./IO-dir/aa/bb"); // 要求所有目录不存在,才能看到相同的现象 System.out.println(dir.isDirectory()); System.out.println(dir.isFile()); System.out.println(dir.mkdirs()); System.out.println(dir.isDirectory()); System.out.println(dir.isFile()); } }
结果展示:
实例七
观察文件重命名
首先创建一个文件如下:
文件重命名如下:
总结
到此这篇关于认识文件与Java中操作文件的文章就介绍到这了,更多相关Java操作文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!