文件IO知识(一)

作者:爱塔居

专栏: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演化出来的。

你可能感兴趣的:(JavaEE,java)