前言
文件是我们日常生活中使用非常广泛的,我们使用任何一个程序都离不开文件操作,这个文件不仅仅指平时可以看见的文件,就连我们的键盘和屏幕都可以看作是一个文件。可见文件操作的重要性,那么今天我将为大家分享关于Java 的文件操作。
什么是文件
我们先来认识狭义上的文件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。
树型结构组织和目录
在Linux中,文件系统的组织结构采用树形结构,也称为层级目录结构。整个文件系统只有一个根目录(/),所有的文件和目录都从根目录开始进行组织和管理。根目录下面可以有多个子目录,每个子目录又可以包含其他子目录和文件,这样就形成了一个树形的结构。
目录是用于组织和存储文件的容器,也可以理解为文件夹。目录可以包含其他目录和文件,从而形成了树形结构。在Linux中,所有的目录和文件都可以通过路径来唯一标识和查找。路径是从根目录开始,一直到具体文件或目录的完整路径。例如,路径“/home/user/Documents/file.txt”表示从根目录开始,进入home目录,再进入user目录,然后进入Documents目录,最后找到名为file.txt的文件。
Windows的文件系统也采用了类似的树形结构,称为文件夹树。每个磁盘分区或驱动器都有自己的根目录,称为根文件夹。根文件夹下面可以有多个子文件夹,每个子文件夹又可以包含其他子文件夹和文件,形成了一个树形的结构。
文件路径
文件路径是指在计算机文件系统中,从根目录开始到具体文件或目录的完整路径。文件路径用于唯一标识和查找文件或目录。
在Linux中,文件路径以斜杠(/)作为分隔符,从根目录开始一直到具体文件或目录。例如,路径“/home/user/Documents/file.txt”表示从根目录开始,进入home目录,再进入user目录,然后进入Documents目录,最后找到名为file.txt的文件。
在Windows中,文件路径以反斜杠(\)或正斜杠(/)作为分隔符,从根文件夹开始一直到具体文件或文件夹。例如,路径“C:\Users\UserName\Documents\file.txt”表示从C盘根文件夹开始,进入Users文件夹,再进入UserName文件夹,然后进入Documents文件夹,最后找到名为file.txt的文件。
虽然Windows下可以使用 \ 和 / 作为分隔符,但是我们还是习惯使用 / ,因为使用 \ 的话,有些情况下还需要做出转义操作。
文件路径可以分为绝对路径和相对路径。
绝对路径是从根目录或根文件夹开始到具体文件或目录的完整路径
相对路径是从当前工作目录开始到具体文件或目录的路径。
例如,在Linux中,如果当前工作目录是“/home/user”,那么相对路径“Documents/file.txt”表示进入Documents目录,找到名为file.txt的文件,这个文件的绝对路径就是“/home/user/Documents/file.txt”。
. 表示当前目录,. .表示当前目录的上一级目录
文件类型
即使是普通文件,根据其保存数据的不同,也经常被分为不同的类型,我们一般简单的划分为文本文件和二进制文件,分别指代保存被字符集编码的文本和按照标准格式保存的非被字符集编码过的文件。
文本文件和二进制文件是计算机中常见的两种文件类型,它们在编码方式、存储方式和用途等方面有所不同。
编码方式:文本文件是基于字符编码的文件,常见的编码有ASCII编码、UNICODE编码等。二进制文件是基于值编码的文件,由二进制数字0和1组成,不存在统一的字符编码。
存储方式:文本文件采用定长编码方式,每个字符占据固定的比特数,一般是8个比特或16个比特。二进制文件采用变长编码方式,由一组二进制数字0和1组成,多少个比特代表一个值由具体的应用决定。
用途:文本文件主要用于存储和处理文本数据,如文本编辑、排版、程序源代码等。二进制文件主要用于存储和处理二进制数据,如图像、音频、视频、可执行文件等。
文件扩展名:文本文件的扩展名一般是.txt、.doc、.docx等,而二进制文件的扩展名则根据具体的文件类型而定,如.jpg、.mp3、.avi等。
那么平时我们应如何判断某一文件是文本文件还是二进制文件呢?教大家一个简单的方法:我们的电脑上不是有记事本吗,将这个文件以记事本的形式打开,如果打开之后没有出现乱码,则是文本文件,如果出现了乱码则说明该文件为二进制文件。
这种就是二进制文件。
这种就是文本文件。
文件权限
文件权限是指在计算机文件系统中,对文件和目录的访问权限。通过对文件设定权限可以达到以下三种访问限制权限:
- 只允许用户自己访问;
- 允许一个预先指定的用户组中的用户访问;
- 允许系统中的任何用户访问。
在Linux中,文件权限分为读、写、执行三种,分别用字母r、w、x表示。每个文件或目录都有三组权限,分别对应文件所有者、同组用户和其他用户。例如,权限设置为“-rwx r-- r–”表示文件所有者具有读、写和执行的权限,同组用户和其他用户则只有读取的权限。
在Windows中,文件权限分为读取、写入、读取和执行、修改四种,分别用字母R、W、RX、M表示。每个文件或文件夹都有一组权限,可以针对不同的用户或用户组进行设置。例如,权限设置为“读取和执行”表示该用户或用户组可以读取和执行该文件,但不能写入或修改。
Java中的文件操作
在Java中操作文件需要用到 java.io.File
类中的方法来进行操作。
File 类的常见属性
这两个属性是用来表示系统的路径分隔符的。
File 类常见构造方法
File(File parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径 |
File(String parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示 |
这些常用构造方法中,第二种直接指定路径的方法是比较常用的。
File 类常用方法
修饰符及返回值类型 | 方法签名 | 说明 |
String | getParent() | 返回 File 对象的父目录文件路径 |
String | getName() | 返回 FIle 对象的纯文件名称 |
String | getPath() | 返回 File 对象的文件路径 |
String | getAbsolutePath() | 返回 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() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
示例一:
public class Test { public static void main(String[] args) throws IOException { File file = new File("d:/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()); } }
盘符不区分大小写
示例二:
public class Test2 { public static void main(String[] args) { File file = new File("d:/test.txt"); System.out.println(file.exists()); //false System.out.println(file.isDirectory()); //false System.out.println(file.isFile()); //false } }
在创建File对象的时候,如果该文件不存在,并不会自动创建出这个文件。
public class Test2 { public static void main(String[] args) throws IOException { File file = new File("d:/test.txt"); System.out.println(file.exists()); //false System.out.println(file.isDirectory()); //false System.out.println(file.isFile()); //false //如果文件创建成功则返回true,创建失败返回false boolean ret = file.createNewFile(); System.out.println(ret); //true System.out.println(file.exists()); //true System.out.println(file.isDirectory()); //false System.out.println(file.isFile()); //true //如果删除文件成功,则返回true,删除失败则返回false ret = file.delete(); System.out.println(ret); //true System.out.println(file.exists()); //false } }
示例三:
public class Test3 { public static void main(String[] args) throws IOException, InterruptedException { File file = new File("d:/test1.txt"); boolean ret = file.createNewFile(); System.out.println(ret); file.deleteOnExit(); //让程序等待30秒再结束 Thread.sleep(30000); } }
使用 deleteOnExit(0
方法的时候,不会立刻删除该文件,而是会等 JVM 运行结束的时候才会删除该文件。
当程序运行结束之后,test1.txt 文件就被删除了
示例四:
public class Test4 { public static void main(String[] args) { File file = new File("D:/code/this-is-my-java-ee-learning"); //list() 方法以字符串的形式返回指定目录下的所有文件夹/文件的名称 String[] str = file.list(); System.out.println(Arrays.toString(str)); } }
示例五:
public class Test5 { public static void main(String[] args) { File file = new File("D:/code/this-is-my-java-ee-learning"); //listFiles() 方法以File对象的形式返回指定目录下的文件夹/文件的 File[] files = file.listFiles(); for (File f : files) { System.out.println(f.getName()); } } }
示例六:
public class Test6 { public static void main(String[] args) { File file = new File("d:/aaa"); //mkdir() 方法创建目录 boolean ret = file.mkdir(); System.out.println(ret); } }
mkdir() 方法只能创建出一级目录,不能创建出多级目录。
public class Test6 { public static void main(String[] args) { File file = new File("d:/aaa/bbb/ccc"); boolean ret = file.mkdir(); System.out.println(ret); } }
要想创建出多级目录就需要使用 mkdirs()
方法。
public class Test6 { public static void main(String[] args) { File file = new File("d:/aaa/bbb/ccc"); boolean ret = file.mkdirs(); System.out.println(ret); } }
示例七:
public class Test7 { public static void main(String[] args) throws IOException { File src = new File("d:/test.txt"); boolean ret = src.createNewFile(); System.out.println(ret); File des = new File("d:/test1.txt"); ret = src.renameTo(des); System.out.println(ret); } }
示例八:
public class Test8 { public static void main(String[] args) throws IOException { File file = new File("d:/test.txt"); boolean ret = file.createNewFile(); System.out.println(file.canRead()); //true System.out.println(file.canWrite()); //true } }