目录
5.1.4 getAbsolutePath()和getCanonicalPath()
5.2.3 canRead()和canWrite() 以及isHidden()
📝认识文件
所谓的"文件"是一个广义的概念,可以代表很多的东西。
操作系统里,会把很多的 硬件设备 和 软件资源 都抽象成 "文件",统一进行管理。
但是大部分情况下,谈到的文件,都是指硬盘的文件。
文件就相当于是针对 "硬盘" 数据的一种抽象。
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。每个文件都有属于它自己的,不是内容的一些信息。
🚩树型结构组织 和 目录
我们所看到的(此电脑)标识其实是目录树的根节点。此电脑下面有CDE盘。总共是500G硬盘。(每个电脑分布的盘是不一样的,有些只有一个C盘,有些只有一个D盘等等)。将目录点进去,可以看到还包含其他的目录/文件。
这样我们可以使用 目录的 层次结构来描述,文件所在的为止 “路径”。
D:\git\java_repository 形如这样的一个字符串,体现出了当前文件在哪个目录中。可以通过文件路径,来确定当前文件具体所在的位置了。
🎈绝对路径和相对路径
- 绝对路径:是以C: D: 盘符开头的,这种路径称为"绝对路径"
- 相对路径:需要先指定一个目录,作为基准目录,从基准目录出发,看看沿着啥样的路线能够找到指定文件,此时涉及到的路径就是“相对路径“,往往是以.(当前目录)或者..(当前目录的上一级)开头的
1》假设当前的基准目录就是 D:\git\乐乐的二号仓库
.\test.txt (./表示当前目录)
2》假设当前的基准目录是 D:\git
.\乐乐的二号仓库\test.txt (在下一路径的里面)
3》假设当前的基准目录是 D:\git\乐乐的二号仓库\111
此时的test.txt文本在111目录的上一级: ..\test.txt (..\表示上一个路径)
如果是命令行进行操作,基准目录,就是你当前所处的目录。
对于IDEA来说,基准目录就是项目目录。 D:\git\java_repository\java-repository\JavaEE_Improve\File_test (项目目录就是File_test)
🚩文件类型
- 文本(文件中保存的数据,都是字符串,保存的内容都是合法的字符)
- 二进制 (文件中保存的数据,仅仅是二进制数据.不要求保存的内容是 合法的字符)
什么是 合法的字符??——字符集/字符编码
utf8有一个大的表格,就列出了什么字符,对应到什么编码
如果你的文件是utf8编码的,此时文件中的每个数据都是合法的utf8编码的字符,就可以认为这个文本是文本文件了。如果存在一些不是utf8合法字符的情况下,就是二进制了。
本身计算机存储的数据都是二进制的。
如何判定一个文件是文本还是二进制?
就直接使用记事本,打开这个文件,如果打开之后,乱码,文件就是二进制,否则就是文本。
很多文件都是二进制的,docx,pptx...都属于二进制的。区分文本和二进制,是很重要的!!写代码的时候,文本文件和二进制文件,代码编写的方式是不同的。
文件都是从两方面入手: 文件系统操作和文件内容操作
- 文件系统操作:比如删除、创建、重命名文件等等
- 文件内容操作:流对象 (读和写文件)也就是对文件里面的内容增删查改等操作。
📝文件系统操作
🎈File 概述
- 1)
java.io.File
类:文件和文件目录路径的抽象表示形式,与平台无关- 2)
File
类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO
流来完成。- 3) 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个
File
对象,但是Java程序中的一个File
对象,可能没有一个真实存在的文件或目录。- 4)
File
对象可以作为参数传递给流的构造器,指明读取或写入的"终点"。
🎈File类的使用
1. 绝对路径 vs 相对路径
(1)绝对路径:是一个固定的路径,从盘符开始
(2)相对路径:是相对于某个位置开始
2. 路径分隔符
pathSeparator就是路径分隔符 D:\project\test 其中\就是pathSeparator
(1) 路径中的每级目录之间用一个路径分隔符隔开。
(2)路径分隔符和系统有关:
windows
和DOS
系统默认使用"\"
来表示- UNIX和URL使用
"/"
来表示我们知道再编程的时候会有转义字符出现 除非用\\才可以。所以我们更喜欢用 /.
(3) Java程序支持跨平台运行,因此路径分隔符要慎用。
为了解决这个隐患,File类提供了一个常量:public static final String separator
:根据操作系统,动态的提供分隔符。
- windows 相当于 \
- linux/Mac 相当于 /
利用这个变量可以自动的提供分隔符。而不担心弄错。
File file=new File("E:/4_4/test.txt"); System.out.println(file); File file1=new File("E:"+File.separator+"4_4"+File.separator+"test.txt"); System.out.println(file1); File file2=new File("E:\\4_4\\test.txt"); System.out.println(file2);
3. 静态成员变量
4. 常用构造器
一个File对象相当于硬盘上的文件。
在构建对象的时候,就需要把这个文件的路径给指定进来 (使用绝对/相对路径来表示)。
5. 常用方法
5.1 获取功能
5.1.1 getParent()
5.1.2 getName()
这里的文件名 是 前缀+扩展 test.txt
5.1.3 getPath()
- 这个方法返回的是构造文件对象时使用的路径字符串。
- 如果文件对象是通过相对路径创建的,则返回的是相对路径字符串。
- 如果文件对象是通过绝对路径创建的,则返回的是绝对路径字符串。
File file1=new File("E:/4_4/test.txt");
System.out.println(file1.getPath());//绝对路径
File file2=new File("test.txt");
System.out.println(file2.getPath());//路径字符串
File file3=new File("4_4/test.txt");
System.out.println(file3.getPath());//相对路径
5.1.4 getAbsolutePath()和getCanonicalPath()
public static void main(String[] args) throws IOException {
File file=new File("e:/test.txt");
System.out.println(file.getAbsoluteFile());
System.out.println(file.getCanonicalFile());
}
windowns上的盘符,是不区分大小写的。
上面的不是很能区别,我们用这种 ./格式
public static void main(String[] args) throws IOException {
File file=new File("./test.txt");
System.out.println(file.getAbsoluteFile());
System.out.println(file.getCanonicalFile());
}
其实绝对路径就是将 相对路径 拼接到 基准目录上。对于IDEA中,基准目录,就是项目所在的目录。我创建的项目是File_test.
5.2判断功能
5.2.1 exists()
判断是否存在文件就可以使用这个方法。
5.2.2 isDirectory()和isFile()
5.2.3 canRead()和canWrite() 以及isHidden()
一般文件系统上都会对文件有权限的限制。(这个事情在Windows上不太明显)很多同学,windows系统里面的用户都是管理员,管理员的权限很大,可以无视文件本身的权限。
5.3 创建功能
注意事项: 如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
5.3.1 createNewFile()
如果文件存在,就打印绝对路径,如果不存在,那么就打印不存在
public static void main(String[] args) throws IOException {
File file=new File("e:/test.txt");
if(file.exists()){
//如果文件存在,就打印文件不存在
System.out.println("文件已经存在");
}else {
//如果文件不存在,就创建文件 并且打印绝对路径
file.createNewFile();
System.out.println(file.getAbsoluteFile());//如果不存在就打印绝对路径
}
}
此时e盘就出现了test.txt文件了。
5.3.2 mkdir()和mkdirs()
创建目录mkdir()
public static void main(String[] args) {
File file=new File("e:/4_4");
boolean mkdir=file.mkdir();//如果目录存在就返回true 不存在就返回false
if(mkdir){
//如果目录存在 就打印创建成功
System.out.println("创建成功");
}
}
创建多个目录,就需要mkdirs()
public static void main(String[] args) {
File file=new File("e:/4_3/111/222");
boolean mkdirs=file.mkdirs();
if(mkdirs){
//如果目录存在,就打印创建成功
System.out.println("创建成功");
}
}
一般都是用mkdirs更好。
5.4 删除功能
5.4.1 delete()
注意事项: Java中的删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
public static void main(String[] args) {
File file=new File("e:/test.txt");
boolean delete=file.delete();
if(delete){
//如果删除成功
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
但是如果删除一个目录,如果里面没有目录和文件的话,那么就删除成功,如果里面有目录和文件的话,那么就删除失败。
我们从上面可以知道,4_3里面有一系列的目录,所以删除失败。而4_4目录中没有目录和文件,所以删除成功
5.4.2 deleteOnExit()
public static void main(String[] args) throws IOException, InterruptedException {
File file=new File("e:/test.txt");
file.deleteOnExit();
Thread.sleep(5000);
System.out.println("程序结束");
}
我们创建一个文件,然后我们调用deleteOnExit()方法之后,休眠5s之后,等程序结束后,就删除文件了。
在office或者wps软件中,在编辑一个文件的时候,就会自动产生一个隐藏的文件,会在你关闭文件的时候自动删除掉。
关闭文件后就自动删除了。
因为当word文件修改并且保存后关闭了,说明线程结束了,此时就自动删除临时文件。所以在deleteOnExit()方法的时候,调用之后等待线程结束才结束,这样就防止数据丢失。为了解决你的电脑突然断电,数据来不及保存的问题,这种机制就可以避免这种情况。
5.5 查看功能
String[]
| list() | 返回 File 对象代表的目录下的所有文件名 (文件名) |
File[] | listFiles() |
返回
File
对象代表的目录下的
所有文件
,以
File
对象
表示
(路径)
|
5.5.1 list()
我们在E:\4_4\5_5目录下创建几个文件,我们调用该方法接收。
public static void main(String[] args) {
File file=new File("e:/4_4/5_5");
String[] strings=file.list();
System.out.println(Arrays.toString(strings));
}
返回的是文件名。
5.5.2 listFiles()
public static void main(String[] args) {
File file=new File("e:/4_4/5_5");
File[] strings=file.listFiles();
System.out.println(Arrays.toString(strings));
}
返回的是路径下的文件。
5.6 更改功能
5.6.1 renameTo()
如果不存在该文件就返回false。如果存在该文件就返回true。
boolean
|
renameTo(File
dest)
|
进行文件改名,也可以视为我们平时的剪切、粘贴操作
|
e盘下有个test.txt文件。
public static void main(String[] args) {
File srcFile=new File("e:/test.txt");//源
File destFile=new File("e:/test2.txt");//目标
boolean ret=srcFile.renameTo(destFile);
System.out.println(ret);
}
此时的文件名称重命名成test2.txt。
📝强化练习
🎈 显示文件及文件夹内容
首先我们输入文件夹路径,首先我们先打印名称,然后继续往后遍历,列出当前目录下的文件或者目录,然后就进入下一个路径了,所以此时我们要用一个count来用于美观的打印出文件的路径,否则都打印成一列看不出来路径的关系,然后我们就依次遍历该路径下的文件或者目录,先\t,然后哦判断是否是文件,如果是文件那么就打印名字,如果不是文件,那么就是文件夹,文件夹就进行递归,按照这样的思路打印即可。
public static void main(String[] args) {
System.out.println("请输入一个文件夹路径:");
Scanner scanner=new Scanner(System.in);
String s=scanner.next();
File file=new File(s);
int count=0;
showDir(file,count);
}
public static void showDir(File file,int count){
System.out.println("|-"+file.getName());//得到当前的纯文件名称
File[] files=file.listFiles();//列出目录下所有的文件
count++;//每次列出当前目录下的文件都count++
for (File file1:files) {
printTab(count);//先tab再打印
if(file1.isFile()){
System.out.println("|-"+file1.getName());//如果是文件那么就打印
}else{
//如果不是文件,那么就是目录,那么就继续遍历
showDir(file1,count);
}
}
}
public static void printTab(int count){
for (int i = 0; i <count ; i++) {
System.out.print("\t");//美观要求
}
}
🎈统计文件夹大小
file.length()
方法用于获取文件的大小,返回的是以字节为单位的文件大小。在Java中,File
类的length()
方法返回一个long
类型的值,表示文件的大小。这个方法可以用于检查文件的大小,以便进行各种操作,比如文件传输、文件拷贝等。
还是以这个目录为例,计算文件夹大小,我们输入文件夹路径,然后传入当参数,文件夹的大小返回值是long类型,然后我们列出当前文件列表,如果是文件夹,那么就继续递归操作,如果不是文件夹,那么就就更新文件夹大小,直到递归完成。
public static void main(String[] args) {
System.out.println("请输入文件夹路径");
Scanner scanner=new Scanner(System.in);
String s=scanner.next();
File file=new File(s);
long size=calculateDirSize(file);//文件夹大小返回值是long
System.out.println(size);
}
public static long calculateDirSize(File file){
int size=0;
File[] files=file.listFiles();
for (File file1:files) {
if(file1.isDirectory()){
//如果是文件夹 那么就继续递归操作
size+=calculateDirSize(file1);
}else {
//如果不是文件夹了,那么就加上当前的文件夹的大小即可
size+=file1.length();
}
}
return size;
}
和上述的文件大小一模一样。
java.io包中File类里面有很多的方法,底层实现。文件系统操作涉及到的和windows下的删除创建复制剪切等操作都是在java代码中File类中都得以实现。
多敲代码,多思考。