一,開頭分析
檔案系統模組是一個簡單包裝的標準 POSIX 檔案 I/O 操作方法集。可以透過呼叫 require("fs") 來取得該模組。文件系統模組中的所有方法均有非同步和同步版本。
(1),檔案系統模組中的非同步方法需要一個完成時的回呼函數作為最後一個傳入形參。
(2),回呼函數的構成是由呼叫的非同步方法決定,通常情況下回呼函數的第一個形參為傳回的錯誤訊息。
(3),如果非同步操作執行正確並傳回,則該錯誤形參則為null或undefined。如果使用的是同步版本的操作方法,一旦發生錯誤,會以通常的拋出錯誤的形式傳回錯誤。
(4),可以用try和catch等語句來攔截錯誤並使程式繼續進行。
我們先看一個簡單的例子,讀取檔案("bb.txt"):
(1),建立文件"bb.txt“,如下內容(”大家好,我是大雄君!(*^__^*) 嘻嘻…“)。
(2),讀取檔案操作如下程式碼:
var fs = require("fs") ;
fs.readFile("bb.txt","utf8",function (error,data){
if(error) throw error ;
console.log(data) ;
}) ;
運行結果:
這裡要注意的是:讀取檔案一定要設定編碼,否則預設是 」buffer「 形式出現。
再看沒設定的運作效果,差別還是很明顯的。如下:
再來一個寫入操作,如下:
var fs = require("fs") ;
var txt = "大家要好好學習NodeJS啊!!!" ;
//寫入檔案
fs.writeFile("bb.txt",txt,function (err) {
if (err) throw err ;
console.log("File Saved !"); //檔案已儲存
}) ;
運行結果:
在列舉一些常用的實例:
// 刪除檔案
fs.unlink('bb.txt', function(){
console.log('success') ;
}) ;
// 修改檔案名稱
fs.rename('bb.txt','bigbear.txt',function(err){
console.log('rename success') ;
});
// 查看檔案狀態
fs.stat('bb.txt', function(err, stat){
console.log(stat);
});
// 判斷檔案是否存在
fs.exists('bb.txt', function( exists ){
console.log( exists ) ;
}) ;
二,Fs與Stream之間的聯繫
"Stream" 具有非同步的特性。我麼可以將一個檔案或一段內容分成未知個制定大小的 "chunk" 去讀取,每讀取到一個 "chunk" 我們就將他輸出。直到文件讀完。這就像 "http1.1" 種支援的 "Transfer-Encoding: chunked" 那樣。 ("chunk"可以以任何的形式存在,NodeJS預設是以 "Buffer" 的形式存在,這樣更有效率)。 NodeJS中的"Stream"具備Unix系統上的一個超級特性就是 ("pipe" ------ 管道)。
還記得 “Http模組那篇” 第一個NodeJS程序, "Hello,大熊!" 嗎?我們基於那個小程式做一下修改,如下程式碼:
(1),建立「bb.html」
(2),修改之前的程序如下:
var http = require('http') ;
var fs = require("fs") ;
var server = http.createServer(function(req,res){
fs.readFile("bb.html","utf-8", function(err, data){
if(err) {
res.writeHead(500, {'Context-Type': 'text/plain'});
res.end('specify file not exists! or server error!');
}
else{
res.writeHead(200, {'Context-Type': 'text/html'});
res.write(data);
res.end();
}
})
}) ;
server.listen(8888) ;
console.log("http server running on port 8888 ...") ;
以下是運行結果:
現在我們需要思考一下,如果我們要發送的不是一個單純的文本文件而是超媒體文件比如說 Google 2014 IO 大會 的全程高清視頻文件。 mp4 格式。長度2個多小時1080p。
大概4個多GB。已知 "readFile" 的工作方式是將檔案讀取到記憶體。那麼這麼大一個文件顯然是不能這麼做的。那該怎麼辦呢?是之後就需要使用 stream 的來做。那麼是這樣的。
程式碼如下像這樣:
fs.createReadStream(__dirname '/vedio.mp4').pipe(res) ;
總結一下:
這些程式碼可以實現需要的功能,但是服務在發送文件資料之前需要緩存整個文件資料到內存,如果"bb.html"文件很
大且並發量很大的話,會浪費很多記憶體。因為使用者需要等到整個檔案快取到記憶體才能接受的檔案數據,這樣導致
用戶體驗相當不好。不過還好 "(req, res)" 兩個參數都是Stream,這樣我們可以用fs.createReadStream()來取代"fs.readFile()"。
三,實例
來一個文件上傳的小栗子:
(1),建立「server.js」
var http = require('http');
var url = require('url');
函數開始(路線,處理程序){
函數onRequest(請求,回應){
var pathname = url.parse(request.url).pathname;
// 路由至對應的業務邏輯
路線(路徑名稱、處理程序、回應、請求);
}
http.createServer(onRequest).listen(3000);
console.log('伺服器正在啟動');
}
Exports.start = 開始;
(2),建立「route.js」
函數路由(路徑名稱、處理程序、回應、請求){
console.log('即將路由'路徑名的請求);
if (typeof handler[路徑名] === '函數') {
返回處理程序[路徑名稱](回應,請求);
} 其他 {
console.log('未找到'路徑名稱的請求處理程序);
response.writeHead(404, {'Content-Type': 'text/html'});
response.write('404 找不到!');
回應.end();
}
}
Exports.route = 路線;
(3),建立「requestHandler.js」
var querystring = require('querystring'),
fs = require('fs'),
強大 = require('強大');
函數開始(回應,請求){
console.log('啟動模組');
var body = ''
''
' '內容=“text/html;字符集=UTF-8”/>'
'頭>'
''
''
''
''
'表單>'
''
'

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。