小生愛

  


                // 文件系统模块 负责读写文件
                let fs = require('fs')
                let log = (...value) => console.log(...value)




                // 例 1. 写文件
                let ws = fs.createWriteStream('lx.txt', 'utf-8')

                // write(写入数据, [格式], [回调])
                ws.write('写入第一段文本', 'utf-8', () => {
                  // 写入完成回调函数
                })

                ws.write('写入第二段文本')

                // end: 调用end 方法以后 后面不允许再用这个ws写入数据 否则报错
                ws.end('结束写入. 这里的提示文案参数可选')




                // 例 2. 
                /**
                 *  createReadStream(文件, options): 同步读取流 进程完全阻塞
                      options: {
                        highWaterMark: 设置每次读取流的大小 默认最大64K,
                        start: 设置读文件的开始位置 可以读取某个文件的一部分内容 不用都读取,
                        end: 设置读文件的结束位置,
                        encoding: 按什么格式读取文件
                      }
                */
                let rs = fs.createReadStream('m.mp4', {
                  // start: 0, 
                  // end: 5,
                  // encoding: 'utf-8'
                  // 下面设置成 16K
                  highWaterMark: 1024 * 16
                })

                // 例 1. 写文件
                let ws2 = fs.createWriteStream('m2.mp4', 'utf-8')

                // createWriteStream(要写入的文件名): 写入流
                // let ws = fs.createWriteStream('m2.mp4')
                // 每次读取完成后触发 data事件可能会触发多次
                rs.on('data', chunk => {
                  if ( ws2.write(chunk) === false ) {
                    // 暂停读文件 指导上一次读取的文件写入完成再继续读文件
                    rs.pause()
                  } else {
                    log('写入完成.')
                  }
                })

                // 如果读一个比较大的文件 每次都会读取一部分 然后写入 
                // drain 监听每次写入是否完成 只有每次写入完成以后才能再触发rs 继续读文件 
                // 否则没写入完成就继续读文件 然后写入 文件内容会乱掉
                ws2.on('drain', () => {
                  // 继续读文件
                  rs.resume()
                })

                // end 全部读取完成后触发事件
                rs.on('end', () => {
                  log('读取完成.')
                })

                rs.on('error', (err) => {
                  // 读取错误 触发error 事件
                })




                // 例 3. pipe
                // 读取流
                /**
                 *  createReadStream(文件, options): 读取流
                      options: {
                        highWaterMark: 设置每次读取流的大小 默认最大64K,
                        start: 设置读文件的开始位置 可以读取某个文件的一部分内容 不用都读取,
                        end: 设置读文件的结束位置,
                        encoding: 按什么格式读取文件
                      }
                */
                let rs3 = fs.createReadStream('m.mp4', {
                  // start: 0, 
                  // end: 5,
                  // encoding: 'utf-8'
                  // 下面设置成 16K
                  highWaterMark: 1024 * 16
                })

                // 写入m3.mp4
                let ws3 = fs.createWriteStream('m3.mp4')

                // pipe: 会自动把读取的流写入到m3.mp4 写入完成后再继续读文件
                rs3.pipe(ws3)

                // 读完数据 触发 data 事件 可能会触发多次
                rs3.on('data', chunk => {
                  log(chunk)
                })

                // 全部读完触发 end 事件
                rs3.on('end', () => {
                  log('例3 写入完成.')
                })