• 这一次,弄明白JS中的文件相关(一):概念篇


    概念是学习的基础。在学习JS中的文件操作之前,先把文件相关的各种概念搞清楚,很有好处。

     

    1. 二进制:

    计算机硬件仅能处理和存储二进制数据,所以不管是你正在写的代码,还是你硬盘里的小姐姐,都是以二进制的形式存储于电脑的内存和硬盘里的。

    2. 编码规则:

    二进制计算机看得懂,我们看不懂怎么办啊?我们能看懂的是文字、图片、视频。编码规则,就是二者之间的桥梁。

    文本的编码规则很简单,就是二进制(先转成16进制)和我们能看懂的字符一一对应,图片和视频的编码要复杂一些。但可以简单理解为:二进制数据经过不同的编码规则,编码成不同的文件格式。

    3. 字符集:

    字符集是和编码规则密切相关的一个概念,它定义了一组字符以及这些字符对应的二进制编码。

    比如Unicode字符集,包括UTF-8、UTF-16、UTF-32几种编码规则。

    字符集主要应用于文本数据,相比之下,编码规则这个概念更为广泛,所有类型的文件都有自己的编码规则,不仅限于文本文件。

    4. 文本文件:

    文本文件,是指采用ASCII、UTF-8等文本编码规则创建的文件,其中的内容主要是人类可直接阅读的文字信息。

    5. 二进制文件:

    除了文本文件之外,其他类型的文件,如图像、音频、视频和可执行程序等,通常被统称为二进制文件,它们的编码规则相对复杂且非文本形式。

    6. 文件类型:

    文件类型指的是根据文件的内容或用途进行的大类别划分。例如,文本文件、图像文件、音频文件、视频文件、文档文件、可执行程序等。

    7. 文件格式:

    相较于文件类型,文件格式是一个更具体的术语,每个大类别的文件类型下可能包含多种不同的文件格式,例如文本文件包括txt、doc、xml等多种具体格式。

    8. 文件后缀名:

    文件后缀名并不一定是文件的真实类型,我们都知道后缀名是可以随便改的。在Linux系统中,甚至没有文件后缀名。

    它的作用,只是让操作系统用默认的程序打开这个文件。在控制面板中,我们知道有一个配置是,每种文件后缀名的默认打开应用。

    在这方面,有点类似于浏览器根据响应内容的mime类型,来对响应做不同的处理。

    9. 文件的编码:

    一个文件的编码,指的是创建这个文件时所使用的编码规则,关键词是“创建”。

    10. 用不同的编码打开文件:

    只有使用创建文件时采用的编码规则,才能正确打开文件。当我们用其他的编码规则试图打开文件时,将会无法打开,或者看到乱码。

    这个过程中,底层的二进制数据保持不变,变化的是:因为编码规则的改变,我们所看到的内容。

    11. 文件格式转换:

    这个过程中,和上面是相反的。我们看到的内容保持不变,变化的是:因为编码规则的改变,底层的二进制数据不一样了。

    比如我们把jpg文件转换为png,我们看到的内容是一样的,但底层的二进制数据就完全变了。

    12. 流:

    流这个概念,很抽象。流是一种传输数据的方式,快速连续的传输数据,允许数据分段传输。与流相对的,是一次性传输整个数据块(block)。

    你可以理解为把一只大象装冰箱,和把大象煮成肉汤用一根管子流入冰箱。

    我们对流比较形象的体验包括:服务器想返回一个大的文件,如果直接把文件返回,文件就会全部装入内存,可能导致内存被占满。但如果采用流的方式传输,只占用很少的内存就可以了。

    在浏览器端呢,如果不采用流的方式接收文件,就要等文件全部传输完成才能开始下载,比如视频全部下载完成才能开始观看。使用流的方式接收,就可以边传输边下载,边下载边观看了。

    流的诞生,首先是因为硬件的发展,开始支持这种数据传输的方式,服务器、浏览器、网络设备具备了传输流、处理流的能力。编程语言又对流进行了高级抽象,提供了流相关的API。它最早出现于Unix系统的I/O模型,然后被用于TCP/IP协议,现在,流被广泛的应用于网络通信、文件I/O、数据库连接、web开发等,可以说流无处不在。

    一个最简单的流,包括数据来源(字符串、文件等)和数据的去向。打开流,数据开始传输,传输完成后,再手动关闭流。当然,大部分编程框架为了方便,都提供了传输完成后自动关闭流的功能。

    那么在平时开发中,我们和流又有什么关系呢?

    服务器端:在服务器端发送和接收数据,是否以流的方式进行,是我们自己选择的。后端语言都提供流相关的API,比如nodejs的Stream类。

    网络传输中:数据都是以字节流的形式传输的。

    浏览器端:浏览器会自动的以流的形式发送和接收数据,开发者无需显式操作。这也是我们前端在开发中,感受不到流的存在,很少使用流的原因。

    需要注意的是,不管服务器是否采用流的方式发送数据,在网络传输阶段,都是字节流。浏览器也不关心服务器是否使用流,因为经过网络传输,到了浏览器这儿,接收到的都是流。

    尽管如此,对于服务器来说,显式的以流的方式接收和发送数据,仍然是很有好处的。

    13. mime类型:

    mime类型是一种标准化的互联网标准,用于描述在网络上传输的数据类型。最初是为了扩展电子邮件以支持多种数据类型而设计的,但现在广泛应用于HTTP协议中。

    mime类型由两部分组成:主要类型和子类型,中间用斜线分隔。例如:text/plain、image/jpeg、application/pdf等。

    mime类型和文件格式大部分时候一一对应。你可以理解,在我们电脑里是文件格式,在HTTP协议中是mime类型。

    14. 一次HTTP请求:

    一次完整的HTTP请求,是指从浏览器发送请求,到浏览器接收完所有数据的全过程。如果请求的是一个视频,那么直到浏览器把这个视频下载完成,这次HTTP请求才算结束。

    也就是说,一个HTTP请求完全可能持续很长时间,并不都是我们大部分时候看到的很快完成的。当然,得益于接收到的是流数据,浏览器可以边下载边播放。

  • 相关阅读:
    leetcode 周赛 364
    Arrays.asList()方法:隐患与解决之道
    一栈走天下:使用HBuilderX高效搭建Uni-App微信小程序开发环境
    深入剖析Linux线程特定数据
    集合类再探:不可变类的好处,Collector接口详解,使用内部迭代
    Oracle-truncate误删数据恢复
    数据结构 桶排序 基数排序
    PW2162芯片
    Python中的魔法函数(__init__()和__ str__())
    【趣学算法】Day2 贪心算法——最优装载问题
  • 原文地址:https://www.cnblogs.com/luzeyu/p/17962431