概念是学习的基础。在学习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请求完全可能持续很长时间,并不都是我们大部分时候看到的很快完成的。当然,得益于接收到的是流数据,浏览器可以边下载边播放。

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

  1. js中scroll滚动相关

    js中scroll滚动相关 scroll,滚动,一般讨论的是网页整体与浏览器之间的关系. 一.元素相关 属性/方法 解释 element.scrollHeight 返回元素的整体高度. element ...

  2. Head First Python-Python中与文件相关的操作-读、处理、写

    最近在看head first python,前面也写了一些笔记,但是基本上没有涉及到一些完整的代码,现在将书中的文件相关操作的代码整理,供以后参考. 主要分为两大部分,读取文件.处理异常,处理文件.存 ...

  3. JavaScript中的this详解(彻底弄懂js中的this用法)!

    要想学好js,那么其中那些特别令人混淆迷惑的知识点,就一定要弄清楚.this关键字就是其中让初学者比较迷惑的知识点之一,不过灵活运用this可以提升代码的性能和复用性,那么今天我就和大家一起来了解th ...

  4. linux中Makefile文件相关内容

    第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...

  5. 让你弄懂js中的闭包

    目录 闭包 闭包如何产生 闭包是什么 常见的闭包 闭包的作用 闭包的生命周期 闭包的应用 闭包的缺点 内存泄露 内存溢出 闭包面试题 闭包 之前在我执行上下文执行上下文栈这篇文章中,出现了这样一个题目 ...

  6. 彻底弄懂JS中的this

    首先,用一句话解释this,就是:指向执行当前函数的对象. 当前执行,理解一下,也就是说this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定.this到底指向谁?this的最终指向的 ...

  7. 分分钟弄明白UML中泛化 , 实现 , 关联, 聚合, 组合, 依赖

    在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization), 关联(Association), 聚合(Aggregation), 组合(Compo ...

  8. 弄明白kubernetes中的“三种IP”

    Node IP : Node节点的IP地址 Pod IP:Pod的IP地址 Cluster IP : Service 的IP地址 首先,Node IP是Kubernetes集群中每个节点(服务器)物理 ...

  9. 今天才知道原来我还没弄清楚js中全局变量和局部变量的定义...

    查资料看到这段还不错,来源:原文:https://blog.csdn.net/czh500/article/details/80429133 粘过来记录一下... 1.使用var声明变量,在方法内部是 ...

  10. 配置webpack.config.js中的文件

    webpack.config.js文件中,主要包括 entry:入口文件 output:出口文件 module:模块 plugins:插件 这几部分 1.基本配置 运行 webpack 这一命令可以将 ...

随机推荐

  1. 【干货】前端开发VUE实例

    最近公司招聘前端开发----VUE方向. 技术面试是必不可少的,发现大多数人应该没有掌握其开发技术,今天就大概总结一下 一.准备工作 需要用到VSCODE最新版,nodejs,vue2.0(现在vue ...

  2. Regions 题解

    Regions 这里提供一种时间复杂度不那么优秀但十分好写也好理解的做法. 题目大意 给定一颗 \(n\) 个节点的树,每个节点拥有一个颜色,进行若干次询问,每次询问给出两种颜色 \(A,B\),求所 ...

  3. PolarD&N2023秋季个人挑战—Crypto全解

    EasyRSA (额..这个题看错了不是挑战赛的.这里当做好题记录下来了) 题目信息:500 分 5 Polar币 from Crypto.Util.number import bytes_to_lo ...

  4. Redis主从复制部署小结

    Redis主从 搭建主从架构 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离. 主从数据同步原理 全量同步 主从第一次建立连接时,会执行全量同 ...

  5. 安装了less后仍然报错:Error: Cannot find module 'less'

    结果是命令有点问题,正常来说是用下面的: npm i less –save-dev-g 然后可以正常启动了: --------------------------------------------- ...

  6. kafka和zookeeper安装

    一.Kafka简介 Kafka 被称为下一代分布式消息系统,是非营利性组织ASF(Apache Software Foundation,简称为ASF)基金会中的一个开源项目,比如HTTP Server ...

  7. pkg-config手册

    定义 pkg-config是一款用于返回已安装库元信息的工具: (语法)概要 pkg-config [--modversion] [--help] [--print-errors] [--silenc ...

  8. Python中的爬虫应用及常用Python库

    Python的爬虫应用非常广泛,以下是一些典型的示例: 数据采集:使用爬虫可以从网页上抓取数据,并将其保存到本地或数据库中.这对于构建大规模数据集.进行市场调研.舆情监测等任务非常有用. 搜索引擎索引 ...

  9. freeswitch的一个性能问题

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在fs的使用过程中,会遇到各种各样的问题,各种问题中,性能问题是最头疼的. 最近在测试某些场景的时候,压测会造成fs的内存占用持续升 ...

  10. C#中的类和继承

    公众号「DotNet学习交流」,分享学习DotNet的点滴. 类继承 通过继承我们可以定义一个新类,新类纳入一个已经声明的类并进行扩展. 可以使用一个已经存在的类作为新类的基础.已存在的类称为基类(b ...