<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # fs Node.js內置的`fs`模塊就是文件系統模塊,負責讀寫文件。 和所有其它JavaScript模塊不同的是,`fs`模塊同時提供了異步和同步的方法。 回顧一下什么是異步方法。因為JavaScript的單線程模型,執行IO操作時,JavaScript代碼無需等待,而是傳入回調函數后,繼續執行后續JavaScript代碼。比如jQuery提供的`getJSON()`操作: ``` $.getJSON('http://example.com/ajax', function (data) { console.log('IO結果返回后執行...'); }); console.log('不等待IO結果直接執行后續代碼...'); ``` 而同步的IO操作則需要等待函數返回: ``` // 根據網絡耗時,函數將執行幾十毫秒~幾秒不等: var data = getJSONSync('http://example.com/ajax'); ``` 同步操作的好處是代碼簡單,缺點是程序將等待IO操作,在等待時間內,無法響應其它任何事件。而異步讀取不用等待IO操作,但代碼較麻煩。 ## 異步讀文件 按照JavaScript的標準,異步讀取一個文本文件的代碼如下: ``` 'use strict'; var fs = require('fs'); fs.readFile('sample.txt', 'utf-8', function (err, data) { if (err) { console.log(err); } else { console.log(data); } }); ``` 請注意,`sample.txt`文件必須在當前目錄下,且文件編碼為`utf-8`。 異步讀取時,傳入的回調函數接收兩個參數,當正常讀取時,`err`參數為`null`,`data`參數為讀取到的String。當讀取發生錯誤時,`err`參數代表一個錯誤對象,`data`為`undefined`。這也是Node.js標準的回調函數:第一個參數代表錯誤信息,第二個參數代表結果。后面我們還會經常編寫這種回調函數。 由于`err`是否為`null`就是判斷是否出錯的標志,所以通常的判斷邏輯總是: ``` if (err) { // 出錯了 } else { // 正常 } ``` 如果我們要讀取的文件不是文本文件,而是二進制文件,怎么辦? 下面的例子演示了如何讀取一個圖片文件: ``` 'use strict'; var fs = require('fs'); fs.readFile('sample.png', function (err, data) { if (err) { console.log(err); } else { console.log(data); console.log(data.length + ' bytes'); } }); ``` 當讀取二進制文件時,不傳入文件編碼時,回調函數的`data`參數將返回一個`Buffer`對象。在Node.js中,`Buffer`對象就是一個包含零個或任意個字節的數組(注意和Array不同)。 `Buffer`對象可以和String作轉換,例如,把一個`Buffer`對象轉換成String: ``` // Buffer -> String var text = data.toString('utf-8'); console.log(text); ``` 或者把一個String轉換成`Buffer`: ``` // String -> Buffer var buf = new Buffer(text, 'utf-8'); console.log(buf); ``` ## 同步讀文件 除了標準的異步讀取模式外,`fs`也提供相應的同步讀取函數。同步讀取的函數和異步函數相比,多了一個`Sync`后綴,并且不接收回調函數,函數直接返回結果。 用`fs`模塊同步讀取一個文本文件的代碼如下: ``` 'use strict'; var fs = require('fs'); var data = fs.readFileSync('sample.txt', 'utf-8'); console.log(data); ``` 可見,原異步調用的回調函數的`data`被函數直接返回,函數名需要改為`readFileSync`,其它參數不變。 如果同步讀取文件發生錯誤,則需要用`try...catch`捕獲該錯誤: ``` try { var data = fs.readFileSync('sample.txt', 'utf-8'); console.log(data); } catch (err) { // 出錯了 } ``` ## 寫文件 將數據寫入文件是通過`fs.writeFile()`實現的: ``` 'use strict'; var fs = require('fs'); var data = 'Hello, Node.js'; fs.writeFile('output.txt', data, function (err) { if (err) { console.log(err); } else { console.log('ok.'); } }); ``` `writeFile()`的參數依次為文件名、數據和回調函數。如果傳入的數據是String,默認按UTF-8編碼寫入文本文件,如果傳入的參數是`Buffer`,則寫入的是二進制文件。回調函數由于只關心成功與否,因此只需要一個`err`參數。 和`readFile()`類似,`writeFile()`也有一個同步方法,叫`writeFileSync()`: ``` 'use strict'; var fs = require('fs'); var data = 'Hello, Node.js'; fs.writeFileSync('output.txt', data); ``` ## stat 如果我們要獲取文件大小,創建時間等信息,可以使用`fs.stat()`,它返回一個`Stat`對象,能告訴我們文件或目錄的詳細信息: ``` 'use strict'; var fs = require('fs'); fs.stat('sample.txt', function (err, stat) { if (err) { console.log(err); } else { // 是否是文件: console.log('isFile: ' + stat.isFile()); // 是否是目錄: console.log('isDirectory: ' + stat.isDirectory()); if (stat.isFile()) { // 文件大小: console.log('size: ' + stat.size); // 創建時間, Date對象: console.log('birth time: ' + stat.birthtime); // 修改時間, Date對象: console.log('modified time: ' + stat.mtime); } } }); ``` 運行結果如下: ``` isFile: true isDirectory: false size: 181 birth time: Fri Dec 11 2015 09:43:41 GMT+0800 (CST) modified time: Fri Dec 11 2015 12:09:00 GMT+0800 (CST) ``` `stat()`也有一個對應的同步函數`statSync()`,請試著改寫上述異步代碼為同步代碼。 ## 異步還是同步 在`fs`模塊中,提供同步方法是為了方便使用。那我們到底是應該用異步方法還是同步方法呢? 由于Node環境執行的JavaScript代碼是服務器端代碼,所以,絕大部分需要在服務器運行期反復執行業務邏輯的代碼,_必須使用異步代碼_,否則,同步代碼在執行時期,服務器將停止響應,因為JavaScript只有一個執行線程。 服務器啟動時如果需要讀取配置文件,或者結束時需要寫入到狀態文件時,可以使用同步代碼,因為這些代碼只在啟動和結束時執行一次,不影響服務器正常運行時的異步執行。 ## 參考源碼 [用fs讀寫文件](https://github.com/michaelliao/learn-javascript/tree/master/samples/node/fs)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看