平时我们所谈到的“文件”都是指硬盘上的文件
硬盘(外存)和内存相比:
- 速度:内存比硬盘块很多
- 空间:内存空间比硬盘小
- 成本:内存比硬盘贵(都挺便宜的了)
- 持久化:内存掉电后数据丢失,外存掉电后数据还在
之前的代码,绝大部分都是围绕内存展开的,JavaSE数据结构中定义个变量,其实就是在内存上申请空间,Mysql主要就是操作硬盘!!
文件IO在这里也是操作硬盘!
- 文件操作:创建文件,删除文件,重命名文件,创建目录
- 文件内容操作:针对文件内容进行读和写
路径:咱们电脑文件系统上一个文件/目录的具体位置
目录:计算机专业术语
文件夹:通俗说法(大白话)
文件路径是从此电脑出发一直往下走,直达目标文件,此时这中间经过的内容!
Windows都是从”此电脑“起头的,表示路径的时候,也可可以把此电脑省略,直接从盘符开始(C盘,D盘)
D:\project\山东大学\教育服务团队\数学专业课件\高等代数\2023课件\矩阵初阶……
实际表示路径是通过字符串表示,每个目录之间通过 \或者/ 来分割(只在Windows下使用,代码中需要写成“\\"《——转义字符
绝对路径:从盘符开始,一层一层往下找,这个过程得到的路径
相对路径:从给定的某个目录出发,一层一层往下找,这个过程得到的路径(一定要明确基准目录(工作目录)是啥!)
关于路径,非常关键,后面很多地方都会涉及到,尤其是相对路径!!
相对路径一定要明确工作目录(基准目录)是啥??
文件系统上,任何一个文件对应的路径是唯一的!!不会存在两个路径相同,文件却不同的情况!!
在Linux,可能存在一个文件,有两个不同的路径能找到(Windows系统不存在)
Windows上可以认为:路径和文件是一对一的!!路径就相当于一个文件的”身份标识“!!
文本文件 VS 二进制文件
文本文件,存储的是文本,文本文件的内容都是由ASCII字符构成的!!
文本文件里存储的数据,就是遵守ASCII或者其他字符集的编码,所得到的文件,本质上存的是字符(不仅仅是char)
二进制文件存储的是二进制数据!没有任何限制,存啥都可以!!
最简单粗暴的方式来判定:文本文件跟二进制文件的区别??
直接使用记事本打开某个文件!!(记事本是按照文本的方式来解析的)
如果你看到的内容能看懂《——》文本文件
如果你看到的内容看不懂(乱糟糟的)《——》二进制文件
二进制都是一个一个的字符,记事本尝试把前前若干个字节的数据往utf8码里面套,套出来啥就是啥,套不出来就是方块!
文本文件:txt文件,.java文件,.c文件
二进制文件:.class文件,.exe文件,.jpg文件,.mp3文件
word编辑的是文本??还是二进制??(二进制)
excel编辑的表格是文本??还是二进制??(二进制)
文件操作系统:
Java标准库给我们提供了File这个类
File对象是硬盘上的一个文件的”抽象“表示
文件是存储在硬盘上的,直接通过代码操作硬盘,不太方便,则在内存中创建一个对应的对象,操作这个内存中的对象,就可以间接的影响到硬盘的文件情况了!!
1.构造File对象
构造的过程中,可以使用绝对路径/相对路径,进行初始化,这个路径指向的文件,可以是真实存在的,也可以是不存在的!
import java.io.File; import java.io.IOException; public class Main1 { public static void main(String[] args) throws IOException { //就可以通过File对象进行操作了! //new 一个File对象 File file=new File("./cat.jpg"); //./cat.jpg相对路径写法 //file提供的一些方法 System.out.println(file.getParent()); System.out.println(file.getName()); System.out.println(file.getPath()); //返回File文件的绝对路径 System.out.println(file.getAbsolutePath()); System.out.println(file.getCanonicalPath());//抛异常 } }
2.File提供的一些方法
一看名字就知道咋用了!!官方文档可搜~
import java.io.File; import java.io.IOException; public class Main2 { public static void main(String[] args) throws IOException { //在相对路径中./通常可以省略 // 路径写啥都行,只要程序能访问到对应的目录就可以!如:./hello_word.txt File file=new File("./hello_word.txt"); //判定该文件是否存在 System.out.println(file.exists()); //是否为目录 System.out.println(file.isDirectory()); //是否为文件 System.out.println(file.isFile()); //创建文件 file.createNewFile();//抛异常 System.out.println("====================="); //判定该文件是否存在 System.out.println(file.exists()); //是否为目录 System.out.println(file.isDirectory()); //是否为文件 System.out.println(file.isFile()); } }
该段代码的运行结果为:
IDEA工作目录就是项目所在的目录
写相对路径就是从system_code这一级为基准来展开的!!
目录的创建:
import java.io.File; public class Main3 { public static void main(String[] args) { //多级目录 File file=new File("test_dir/aaa/bbb"); //只能创建一级目录 // file.mkdir(); //创建多级目录 file.mkdirs(); } }
目录的删除,用delete()方法即可
创建好目录之后,可以通过List()来罗列出目录里面的内容
public static void main(String[] args) { //目录的删除 File file=new File("test_dir"); String[] result=file.list(); System.out.println(Arrays.toString(result)); File[] result1=file.listFiles(); System.out.println(Arrays.toString(result1)); }
重命名操作:
public static void main(String[] args) { //重命名操作 File src=new File("./test_dir"); File dest=new File("./test222"); //重命名 src.renameTo(dest); }
文件内容操作:
这个就不是一个类就能完成的了,涉及到很多类,一组类!!
针对文本文件提供了一组类,统称为”字符流“,读写的基本单位是字符
典型代表:Reader(输入),Writer(输出)
针对二进制文件提供了一组类,统称为”字节流“,读写的基本单位是字节
典型代表:InputStream(输入),OutputStream(输出)
每种流对象又分为两种:
输入流:Reader(输入),InputStream(输入)
输出流:Writer(输出),OutputStream(输出)
需要我们认清楚输入/输出的方向!!
从硬盘读数据到内存叫做输入:Reader(输入),InputStream(输入)
从内存数据写到硬盘叫做输出:Writer(输出),OutputStream(输出)