作者:爱塔居
专栏:JavaEE
作者简介:大三学生,希望和大家一起进步。
文章目录
目录
文章目录
前言
一、路径
二、文本文件和二进制文件
三、文件系统操作
四、“字符流”和“字节流”
五、utf8和unicode
前言
平时谈到的“文件”,指的都是硬盘上的文件。
硬盘(外存)和内存相比:
速度:内存比硬盘快很多。
空间:内存空间比硬盘小。
成本:内存比硬盘贵一点。
之前的代码绝大部分都是围绕内存展开的。JavaSE+数据结构。定义个变量,其实就是内存上申请空间。
MySQL主要就是操作硬盘
文件IO也是操作硬盘。
为什么C语言没有介绍文件操作系统?
C的标准库东西特别少,不支持文件系统操作。即使C++,也是2017(C++17)才支持的。
一、路径
这是我们文件系统上一个文件/目录,具体位置。
计算机的目录是有层级结构的。
文件系统是以树型结构来组织文件和目录的。N叉树。
文件路径就是以树根节点出发,沿着树杈,一路往下走,到达目标文件,此时这中间经过的内容、
Windows都是以“此电脑”起头的。表示路径的时候,可以把“此电脑”省略,直接从盘符开始表示。
实际表示路径,是通过一个字符串表示,每个目录之间使用斜杠/来分割
从盘符开始,一层一层往下找,这个过程,得到的路径,绝对路径。以“此电脑”为工作路径。
从给定的某个目录出发,一层一层往下找,这个过程得到的路径,相对路径。一定要明确基准目录是啥。
.相对路径中,是一个特殊符号,代表当前目录,
..也是特殊符号,表示当前目录的上级目录 。
文件系统上,任何一个文件,对应的路径是唯一的。不会存在,两个路径相同,但是文件不同的情况。
在Linux,可能存在一个文件,有两个不同的路径能找到它。在Windows上不存在。
在Windows上,可以认为,路径和文件是一一对应的,路径就相当于是一个文件的“身份标识”。
二、文本文件和二进制文件
文本文件,存储的是文本。文本文件的内容都是由ASCII字符构成的。对于ASCII来说,表示范围0-127。后来,由搞出了一些其他的编码方式,utf8之类的,就可以针对其他的语言文字符号进行编码了。
utf8,就可以想象成一个更大的表,但终究是有限的。
文本文件里存储的数据,就是遵守ASCII或者其他字符集编码,所得到的文件。
二进制文件里面存储的是二进制数据,则没有任何字符集的限制(存啥都行)。
简单粗暴的判定方式: 直接使用记事本打开某个文件,如果看得懂就是文本文件(因为记事本就是按照文本的方式来解析显示的),看不懂就是二进制文件。
txt:文本文件
.java/.c:文本文件
.class: 二进制文件
.exe :二进制文件
jpg,mp3:二进制文件
记事本出现乱码的原因:
二进制都是一个一个的字节,记事本尝试着把当前若干个字节的数据往utf8码表里套,套出来的是啥就是啥。
word编辑的docx和excel编辑的表格都是二进制文件。
三、文件系统操作
Java标准库,给我们提供了File这个类。File对象是硬盘上的一个文件的“抽象”表示。
文件是存储在硬盘上的,直接通过代码操作硬盘,不太方便,就在内存中创建一个对应的对象。操作这个内存中的对象,就可以间接地影响到硬盘的文件情况了。
1.构造File对象
构造的过程中,可以使用绝对路径/相对路径来进行初始化。这个路径指向的文件,可以是真实存在的,也可以不是真实存在的。
import java.io.File;
public class IODemo1 {
public static void main(String[] args) {
File file=new File("d:/chen.jpg");
}
}
属性
修饰符及类型 | 属性 | 说明 |
---|---|---|
static String | pathSeparator | 依赖于系统的路径分隔符,String类型的表示 |
static char | pathSeparator | 依赖于系统的路径分隔符,char类型的表示 |
构造方法
签名 | 说明 |
---|---|
File(File parent,String chiled) | 根据父目录+孩子文件路径,创建一个新的 |
File(String pathname) | 根据文件路径创建一个新的File实例,路径可以是绝对路径或者相对路径 |
File(String parent,String child) | 根据父目录+孩子文件路径,创建一个新的File实例,父目录用路径表示 |
方法
修饰符及返回值类型 | 方法签名 | 说明 |
String | getParent() | 返回File对象的父目录文件路径 |
String | getName() | 返回File对象的纯文件名称 |
String | getPath() | 返回File对象的文件路径 |
String | getAbsolutePath() | 返回File对象的绝对路径 |
String | getCanonicalPath() | 返回File对象的修饰过的绝对路径 |
boolean | exists() | 判断File对象描述的文件是否真实存在 |
boolean | isDirectory() | 判断File对象代表的文件是否是一个目录 |
boolean | ifFile() | 判断File对象代表的文件是否是一个普通文件 |
boolean | createNewFile() | 根据File对象,自动创建一个空文件。成功创建后返回true |
boolean | delete() | 根据File对象,删除该文件。成功删除后返回true |
void | deleteOnExit() | 根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才会进行 |
String[] | list() | 返回File对象代表的目录下的所有文件,以File对象表示 |
File[] | listFiles() | 返回File对象代表的目录下的所有文件,以File对象表示 |
boolean | mkdir() | 返回File对象代表的目录 |
boolean | mkdirs() | 创建File对象代表的目录,如果必要,会创建中间的目录 |
boolean | renameTo(Filedest) | 进行文件改名,也可以视为我们平时的剪切、粘贴操作 |
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
示例:
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
public class IODemo1 {
public static void main(String[] args) throws IOException {
File file=new File("d:/chen.txt");
System.out.println(file.getParent());
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getAbsoluteFile());
System.out.println(file.getCanonicalFile());
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.list());
System.out.println(file.exists());
file.delete();
System.out.println(file.exists());
file.createNewFile();
System.out.println(file.exists());
file.mkdir();
file.mkdirs();
}
}
四、“字符流”和“字节流”
针对文本文件,提供了一组类,统称为“字符流”(典型代表,Reader,Writer)
针对二进制文件,提供了一组类,统称为“字节流”(典型代表,InputStream,OutputStream)
每个流对象,又分成两种:
输入的:Reader,inputStream
输出的;Writer,OutputStream
Java有GC,内存一般不用手动释放。但是文件的资源,则需要手动释放。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class IODemo1{
public static void main(String[] args) throws IOException {
InputStream file = new FileInputStream("d:/helloworld.txt");
file.close();//有打开就要有关闭。非常重要,必须写!!!
}
}
进程是使用PCB这样的结构来表示:
1.pid
2.内存指针
3.文件描述符表
记载了当前进程都打开了哪些文件,每次打开一个文件,就会在这个表里,申请到一个位置。
这个表可以当成一个数组,数组下标就是文件描述符,数组元素就是这个文件在内核中的结构体的表示。
而这个表长度是有限制的,不能无休止地打开,又不释放。一旦满了,继续打开,就会打开失败。
这种情况,属于文件资源泄露,十分严重。
五、utf8和unicode
udt8和unicode可以视作两个不同的表,这里的编号是不同的,即使是同一个符号(汉字)得到的数值都是不一样的。
utf8是基于unicode演化出来的。