為什麼計算機中需要各種文件格式(即不同擴展名的文件)?
文件格式是否是伴隨著計算機的誕生而誕生的?在計算機之前應該沒有「格式」這個詞語吧?
這種想法是如何提出的?可不可能推行一種通用格式?
文件格式是領域知識,是不存在通用的。
你是說文件系統格式(NTFS,FAT32) 還是文件格式(文檔,可執行文件),還是說是擴展名(EXE,JPG)?
我回答後2者。文件格式是用於文件輸入輸出的protocal。擴展名與文件格式直接相關,用於方便辨識文件格式。
當一個程序使用文件的時候,要知道這個文件是如何存儲的。文件內部一般都存在overhead,也就是在開頭的部分標識文件格式和參數。比如JPG圖像壓縮文件,開頭會有quality factor, quantization table等參數,然後就是以二進位存儲的數據。
在windows系統中,擴展名是必須的。對於不同擴展名的文件,會調用不同的程序(protocal)。
在linux/unix系統中,很多情況下是不需要文件格式的。舉個例子,可執行文件在windows系統中必須以擴展名exe標識,但是在linux系統中,可執行文件不需要擴展名(但也可以有)。統一擴展名(即無擴展名)是可以能的,只要增加文件overhead的可讀性即可。但是統一文件格式是不可能的,因為每一種文件,每一個程序需要讀寫的文件內容都是不同的,舉例來說讀zip和讀doc文件的方法就肯定不同,因為第一個是壓縮的,第二個不是。簡要答下,挺有意思的問題。
首先,格式肯定不是伴隨計算機而生的,它並不特指文件格式,而是指一種「規格」「規範」「約定」之類的東西。比如你寫合同,最少要有合同正文和甲乙雙方簽字,這個就是合同的格式;比如你去銀行辦業務,要填表單,這個就是銀行需要的格式;再比如你要寫一首古詩,每句要換個行,這也是格式。這些都跟計算機無關,格式是普遍存在的。
其次,格式存在的意義是什麼?如上面的所有東西,都可以歸為「文檔」,或者更通用一些,叫「文本」。理論上,你也可以不需要任何格式,合同就從頭到尾,把約定的事情講清楚就行,去銀行也寫一段文字,上面交代清楚自己的資料,寫詩就從頭寫到尾一大段,也行。沒有格式,這些事情也可以做,那為什麼還需要格式?因為有了格式,效率可以更高,比如你一看合同,就知道我該重點看條款,應該在結尾簽名,一看銀行表單就知道我應該在這欄填姓名,這欄填身份證號,一看分四行每行七字就知道這大概是一首詩了。格式的意義在於規範,讓不同的東西有自己的規範,以便更好地書寫、檢驗、讀取,比如如果沒有銀行表單,你可能怎麼也不知道要寫證件號碼,可能寫了也不知道還要寫發證機關,而有了這個表單(格式)之後,一切都變得好辦了,你好寫,工作人員也好檢查填得對不對,也方便它錄入電腦辦理後續手續。
回到計算機中的文件格式,和上面的格式是一樣的,因為文件有不同的用途,約定自己的格式有助於更好地寫入、檢驗和讀取。比如你要生成一個文本文件,那按照文本文件的格式,直接ASCII編碼,將編碼寫入磁碟就OK,比如要生成一個BPM文件,那按照BMP的格式,分四個部分,先寫BM,再寫文件的元數據,再寫顏色表,再寫圖像數據。這樣其它軟體讀取的時候,一看.txt就知道直接ASCII解碼,當文本顯示就行了,一個.bmp就知道分四個部分讀,讀完計算出像素值再顯示出來。其它格式都依此類推,有了這些格式,生成軟體和讀取軟體可以更好地處理不同類型的文件。
最後,計算機能否有一種通用格式呢?其實這個問題其實不能用「能」或者「不能」來回答。計算機的文件格式是可以分層的,比如最底層,大家都是二進位,0101而已,沒區別,全都是一樣的格式,這正是這些不同格式的文件可以被放在同一個磁碟上的原因。在這之上是文件系統的格式,文件系統可以將這些0101以不同的策略來分布在物理磁碟上,也可以沒事自己做做壓縮、搬遷神馬的。再之上是這些二進位數據0101的含義,同樣的一段數據,可能在作為文本的時候表示「1」,但在作為圖像的一部分的時候表示「一個黑色的點」。所以在「含義」這一層,不同用途的文件是一定會有不同的格式的,即便它們用了什麼火星來的技術,使用相同的物理格式來保存,最後也一定在邏輯含義上有區分,而這些區分具體到我們日常理解的邏輯,便成了不同的文件格式。
P.S.1: 在上面例子中,人與人之間交互可以使用不分格式的「文本」來做,是因為人具有自然語言書寫和理解的能力,比如你寫「我的身份證號是xxx」,或者寫「身份證xxx」,別人都可以理解,但計算機不能,所以計算機必須通過嚴格約定的格式來區分不同格式,在邏輯上不存在通用格式。
P.S.2: 將一個文件用base64編碼,便得到一段上面說的「火星技術」類似的東西,即不管什麼文件看起來都是一樣的格式,但一旦被使用,仍然需要base64解碼,變成不同的文件格式。追求這樣一種看起來通用的格式,並沒有什麼正面意義,反而增加運算量和人的識別難度。不同的文件格式定義了在相同類別中數據存儲的一套規範,這些信息通過規定的方式存儲下來,比如常見的數字視頻文件格式avi,它的文件結構包括一個riff頭,兩個list(一個用於描述媒體流格式,另一個用於保存媒體流數據),一個junk塊和一個可選的索引塊,這些格式規定了數據的編解碼方式,以使得數據能夠按照一定的方式保存下來,並且計算機可以以此方式正確索引和讀取數據。不然的話假如能有一個通用的格式來保存數據那麼必定要囊括所有可知的不同的數據類型,如視頻,音頻,圖像等都是不同的,以此想法的話也必須進行文件結構的定義,這樣的話會造成很大的數據冗餘都用來定義一些無用的數據格式了(比如音頻的話就一定不需要用到圖像的數據格式)。所以目前看來不同擴展名的文件定義
文件格式不是伴隨著計算機的誕生而誕生的,文件歸根結底就是信息的載體。
以音樂為例:有黑膠唱片,有激光唱片,有CD,有磁帶,這些介質(格式)完全和計算機無關。這個問題就和『能否發明一種編程語言,通殺全部領域』一樣的。。。
文件格式其實也算是一種「協議」類的東西,就像網路通信里的IP,TCP,FTP等,是基於雙方達成的共識,目的當然是為了方便信息的管理與傳播。還有,「擴展名」與「文件格式」是兩回事,改變擴展名不會改變文件內部數據流(你可以試試把一個mp3文件後綴改成txt,再用媒體播放器打開)。擴展名僅僅是為了告知操作系統默認情況下用什麼軟體來打開文件。文件格式決定的是文件讀取的演算法。不同的信息媒質的特點不同,比如圖形有色調,透明度等特徵,聲音有頻率等特徵,這些特徵在壓縮編碼時都有重要的應用,正如一樓說的領域都不同。所以通用格式也是不可能的
其實文件格式很好理解,就是:
約定好的閱讀文件的方式!
舉一個例子方便理解:
我有一個學生成績單:
姓名:莫與
數學:100
語文:99
地理:8
英語:99.9
名次:1/60
那麼不同的人對這些信息的需求是不一樣的,比如:
1.家長
假設家長只是想直觀的看到孩子的成績,同時家長首要想看到名次!
約定:第一行名字後面的是名次
所以我們定義家長格式:*.parent,其格式如下:
姓名:莫與 1/60
數學:100
語文: 99
地理:8
英語:99.9
這樣家長們就可以輕鬆get到其想要的信息,並且方便的找到信息中的重點。
2.成績錄入人員
他們只負責錄入成績,至於什麼成績對他們來說可能根本沒有意義,他們只需要數字。並且他們事先約定好數字順序
約定:名次 數學 語文 地理 英語
所以我們定義教師格式:*.teacher,其格式如下:
1 100 99 8 99.9
這樣老師錄入的時候就很方便。
注意:
約定是非常重要的!因為不同的文件格式即代表了不同的約定!這樣只有隻有知道約定的人看到文件的時候才能讀懂它的含義。
這也是為什麼你用記事本打不開圖片或者是出現亂碼,這是因為記事本不知道這個約定。只有知道約定的程序(軟體)才能幫助你閱讀這種文件格式。
這也解釋了為什麼文件格式不能通用,因為不同人的需求不一樣。這是我們的一個小約定,不是別人的,正如你能要求所有人的密碼全一樣。
不過話說回來,你用一個軟體可以打開所有的文件格式,理論上可行,只需要知道所有的約定就可以了。
不過我感覺真正厲害的軟體不需要你的後綴名就能知道你的文件格式,並以正確方式打開。
通俗的說不同的後綴名的文件,代表了不同的輸入格式。不同的程序接受不同的信息和不同的輸入格式。所以我們需要不同的後綴名的文件。
因為計算機性能與人腦的有限性,解決近乎無限的問題,目前為止分治比較有效。
可以講不用文件格式理解為信息的不同載體;不同文件的格式由不同的程序所產生,因此需要安裝不同程序來查看不同文件。通用的格式估計是很難誕生的,但是可以查看所有格式的工具還是可以實現的。樓主試試巴別鳥就明白了,不管什麼格式的文件上傳上去就能預覽,很方便的。
擴展名為了方便不同的程序使用了,說來要不就是二進位要不就是字元,這個相當於一個顯示的篩選器吧。具體我記得有個寫windows為什麼用擴展名而*NIX之前不用的文章。可以搜索引擎下。
推薦閱讀:
※.DS_Store 文件是什麼?
※硬碟為什麼可以分成不同格式的分區?
※ISO9001 質量管理體系如何學習理解?
※為什麼電腦文件保存命名的時候不能用特殊符號,例如"/"?
※ext2 和 FAT 文件系統在文件讀取和處理上,效率差別是怎樣的?產生差異的原因是因為本身的架構差別還是處理機制的不同?