Web全栈~25.文件

3 篇文章 0 订阅

Web全栈~25.文件

上一期

前言

       Web全栈系列博客到了文件这里已经逐步的走向重点。前面的内容之所以很多都不全面,其实根本原因还是自己太懒。。。当然对于一些细节日后会在其他系列的博客去说

       事实上我个人认为,对于Web开发而言,学习的重点更多应该是放在 : 并发、IO、网络安全、内存、权限管理、密码学、分布式等方面。

       当然也不是说其他内容不重要,只是我个人认为学习的重点可以更多地倚重这些方面。

       比如说对于TOB的项目,权限管理是一道很重要的课题。因为对于不同级别的账号登录会有不同的权限和界面。

       对于TOC呢,并发和内存又成了一个很重要的问题。尤其是像电商这种类型的项目。每逢双11淘宝的并发量都会非常的惊人

       对于政府、银行等机密性比较高的项目,密码学又是一个重点

内存和存储空间的关系

       我们都知道计算机是个机器,这个机器主要由CPU、内存、硬盘和输入/输出设备组成。计算机上跑着操作系统,如Windows或Linux,操作系统上运行着各种应用程序,如office等。操作系统将时间分成很多细小的时间片,一个时间片给一个程序用,另一个时间片给另一个程序用,并频繁地在程序间切换。不过,在应用程序看来,整个机器资源好像都归它使用,操作系统给它制造了这种假象。对程序员而言,编写程序时基本不用考虑其他应用程序,做好自己的事就可以了。应用程序看上去能做很多事情,能读写文档、能播放音乐、能聊天、能玩游戏、能下围棋等,但本质上,计算机只会执行预先写好的指令而已,这些指令也只是操作数据或者设备。所谓程序,基本上就是告诉计算机要操作的数据和执行的指令序列,即对什么数据做什么操作,比如:读文档,就是将数据从磁盘加载到内存,然后输出到显示器上;写文档,就是将数据从内存写回磁盘;播放音乐,就是将音乐的数据加载到内存,然后写到声卡上;聊天,就是从键盘接收聊天数据,放到内存,然后传给网卡,通过网络传给另一个人的网卡,再从网卡传到内存,显示在显示器上。

文件的基本概念

二进制思维

       在计算机中,所有文件,不论是可执行文件,还是图片文件、视频文件、word文件、压缩文件又或者txt文件。他们其实都是以0和1的二进制形式保存的。我们所看到的图片、视频又或者文本等都是应用程序对这些二进制的解析结果。

文件类型

       虽然所有数据都是以二进制形式保存,但是为了方便处理数据,高级语言就引入了数据类型的概念。文件处理也是类似,所有文件都是以二进制形式保存。为了便于理解和处理文件,文件自然也会有文件类型的概念。

       文件的类型通常用以扩展名的形式体现。比如,PDF文件类型的扩展名是.pdf,那么图片呢常见的是.jpg或者.png。压缩文件则是.zip。

       每种文件类型都有一定的格式,代表着文件含义和二进制之前的映射体系。比如说,一个Word文件,其中有文本、图片、表格,文本,他们都可能有颜色、字体、字号等,doc文件类型就定义了这些内容和二进制表示之间的映射关系。有的文件类型的格式是公开的,有的可能是私有的,我们也可以定义自己私有的文件格式。

       对于一种文件类型,往往有一种或多种应用程序可以解读它,进行查看和编辑,一个应用程序往往可以解读一种或多种文件类型。在操作系统中,一种扩展名往往关联一个应用程序,比如.doc后缀关联Word应用。用户通过双击试图打开某扩展名的文件时,操作系统查找关联的应用程序,启动该程序,传递该文件路径给它,程序再打开该文件。

       给文件加正确的扩展名是一种惯例,但并不是强制的,如果扩展名和文件类型不匹配,应用程序试图打开该文件时可能会报错。另外,一个文件可以选择使用多种应用程序进行解读,在操作系统中,一般通过右键单击文件,选择打开方式即可。

       文件类型可以粗略分为两类:一类是文本文件;另一类是二进制文件。文本文件的例子有普通的文本文件(.txt),程序源代码文件(.java)、HTML文件(.html)等;二进制文件的例子有压缩文件(.zip)、PDF文件(.pdf)、MP3文件(.mp3)、Excel文件(.xlsx)等。基本上,文本文件里的每个二进制字节都是某个可打印字符的一部分,都可以用最基本的文本编辑器进行查看和编辑,如Windows上的notepad、Linux上的vi。二进制文件中,每个字节就不一定表示字符,可能表示颜色、字体、声音大小等,如果用基本的文本编辑器打开,一般都是满屏的乱码,需要专门的应用程序进行查看和编辑。

文件系统

       文件一般是放在硬盘上的,一个机器上可能有多个硬盘,但各种操作系统都会隐藏物理硬盘概念,提供一个逻辑上的统一结构。在Windows中,可以有多个逻辑盘,如C、D、E等,每个盘可以被格式化为一种不同的文件系统,常见的文件系统有FAT32和NTFS。在Linux中,只有一个逻辑的根目录,用斜线/表示。Linux支持多种不同的文件系统,如Ext2/Ext3/Ext4等。不同的文件系统有不同的文件组织方式、结构和特点,不过,一般编程时,语言和类库为我们提供了统一的API,我们并不需要关心其细节。在逻辑上,Windows中有多个根目录,Linux中有一个根目录,每个根目录下有一棵子目录和文件构成的树。每个文件都有文件路径的概念,路径有两种形式:一种是绝对路径,另一种是相对路径。

       所谓绝对路径,是从根目录开始到当前文件的完整路径,在Windows中,目录之间用反斜线分隔,如C:\code\hello.java,在Linux中,目录之间用斜线分隔,如/Users/laoma/Desktop/code/hello.java。在Java中,java.io.File类定义了一个静态变量File.separator,表示路径分隔符,编程时应使用该变量而避免硬编码。 所谓相对路径,是相对于当前目录而言的。在命令行终端上,通过cd命令进入的目录就是当前目录;在Java中,通过System.getProperty("user.dir")可以得到运行Java程序的当前目录。相对路径不以根目录开头,比如在Windows上,当前目录为D:\laoma,相对路径为code\hello.java,则完整路径为D:\laoma\code\hello.java。 每个文件除了有具体内容,还有元数据信息,如文件名、创建时间、修改时间、文件大小等。文件还有一个是否隐藏的性质。在Linux系统中,如果文件名以.开头,则为隐藏文件;在Windows系统中,隐藏是文件的一个属性,可以进行设置。 大部分文件系统的文件和目录具有访问权限的概念,对所有者、用户组可以有不同的权限,具体权限包括读、写、执行。 文件名有大小写是否敏感的概念。在Windows系统中,一般是大小写不敏感的,而Linux则一般是大小写敏感的。也就是说,同一个目录下,abc.txt和ABC.txt在Windows中被视为同一个文件,而在Linux中则被视为不同的文件。

       操作系统中有一个临时文件的概念。临时文件位于一个特定目录,比如Windows 7中,临时文件一般位于“C:\Users\用户名\AppData\Local\Temp”;Linux系统中,临时文件位于/tmp。操作系统会有一定的策略自动清理不用的临时文件。临时文件一般不是用户手工创建的,而是应用程序产生的,用于临时目的。

文件读写

       文件是放在硬盘上的,程序处理文件需要将文件读入内存,修改后,需要写回硬盘。操作系统提供了对文件读写的基本API,不同操作系统的接口和实现是不一样的,不过,有一些共同的概念。Java封装了操作系统的功能,提供了统一的API。

       硬盘的访问延时,相比内存,是很慢的。操作系统和硬盘一般是按块批量传输,而不是按字节,以摊销延时开销,块大小一般至少为512字节,即使应用程序只需要文件的一个字节,操作系统也会至少将一个块读进来。一般而言,应尽量减少接触硬盘,接触一次,就一次多做一些事情。对于网络请求和其他输入输出设备,原则都是类似的。

       一般读写文件需要两次数据复制,比如读文件,需要先从硬盘复制到操作系统内核,再从内核复制到应用程序分配的内存中。操作系统运行所在的环境和应用程序是不一样的,操作系统所在的环境是内核态,应用程序是用户态,应用程序调用操作系统的功能,需要两次环境的切换,先从用户态切到内核态,再从内核态切到用户态。这种用户态/内核态的切换是有开销的,应尽量减少这种切换。为了提升文件操作的效率,应用程序经常使用一种常见的策略,即使用缓冲区。读文件时,即使目前只需要少量内容,但预知还会接着读取,就一次读取比较多的内容,放到读缓冲区,下次读取时,如果缓冲区有,就直接从缓冲区读,减少访问操作系统和硬盘。写文件时,先写到写缓冲区,写缓冲区满了之后,再一次性调用操作系统写到硬盘。不过,需要注意的是,在写结束的时候,要记住将缓冲区的剩余内容同步到硬盘。操作系统自身也会使用缓冲区,不过,应用程序更了解读写模式,恰当使用往往可以有更高的效率。

       操作系统操作文件一般有打开和关闭的概念。打开文件会在操作系统内核建立一个有关该文件的内存结构,这个结构一般通过一个整数索引来引用,这个索引一般称为文件描述符。这个结构是消耗内存的,操作系统能同时打开的文件一般也是有限的,在不用文件的时候,应该记住关闭文件。关闭文件一般会同步缓冲区内容到硬盘,并释放占据的内存结构。操作系统一般支持一种称为内存映射文件的高效的随机读写大文件的方法,将文件直接映射到内存,操作内存就是操作文件。在内存映射文件中,只有访问到的数据才会被实际复制到内存,且数据只会复制一次,被操作系统以及多个应用程序共享。

  • 48
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值