长春公司做网站郑州陆港开发建设有限公司网站
Node.js 本身没有像 Java 那样严格区分字符流和字节流,区别主要靠编码(encoding)来控制数据是以 Buffer(二进制字节)形式还是字符串(字符)形式处理。
详细解释:
| 方面 | Java | Node.js | 
|---|---|---|
| 字节流 | InputStream / OutputStream | 默认情况下的 Readable / Writable 流,数据是 Buffer(二进制) | 
| 字符流 | Reader / Writer | 流上设置 encoding,数据自动转换成字符串(UTF-8、ASCII 等) | 
| 编码处理 | 字节流和字符流类分开,编码需自己控制 | Buffer 是二进制字节,设置 encoding 自动转换成字符 | 
| 示例 | FileInputStream vs FileReader | fs.createReadStream + encoding 参数 | 
| API差异 | 不同基类,区别明显 | 同一套流 API,参数控制返回类型 | 
举个 Node.js 代码例子说明:
const fs = require('fs');// 字节流(默认,读取到 Buffer)
const stream1 = fs.createReadStream('file.txt');
stream1.on('data', chunk => {console.log(Buffer.isBuffer(chunk)); // true,收到的是 Buffer(二进制)
});// 字符流(设置编码,读取到字符串)
const stream2 = fs.createReadStream('file.txt', { encoding: 'utf8' });
stream2.on('data', chunk => {console.log(typeof chunk); // string,收到的是字符串
});
 
总结
-  
Node.js 流是统一的“字节流”,数据默认是 Buffer 类型的二进制。
 -  
通过给流设置
encoding,Node.js 会自动将字节流转换成字符串,达到类似 Java 字符流的效果。 -  
Java 是在类结构上区分字符流和字节流;Node.js 是靠参数和 Buffer 来决定处理方式。
 
如果你做文件操作,想“像用字符流一样”处理文本,就用带编码的流;如果要处理二进制数据,就用默认的 Buffer 流。
你想了解 Node.js 里跟文件读取(以及文件操作)相关的常见函数,尤其是跟“读取(read)”、“读文件(readFile)”、“创建(create)”、“流(stream)”有关的。顺便帮你补充一些常用但你没说的相关函数。
我帮你把 Node.js 文件系统(fs模块)相关常用方法做个全面的梳理和举例。
Node.js 文件读写相关函数大全
1. fs.readFile() 和 fs.readFileSync()
 
-  
作用:一次性读取整个文件内容(异步和同步版本)
 -  
示例:
 
const fs = require('fs');// 异步读文件
fs.readFile('example.txt', 'utf8', (err, data) => {if (err) throw err;console.log('异步读文件内容:', data);
});// 同步读文件
const content = fs.readFileSync('example.txt', 'utf8');
console.log('同步读文件内容:', content);
 
2. fs.read()
 
-  
作用:读取文件的部分内容(基于文件描述符,低级 API)
 -  
需要先打开文件,得到文件描述符(fd)
 -  
示例:
 
const fs = require('fs');fs.open('example.txt', 'r', (err, fd) => {if (err) throw err;const buffer = Buffer.alloc(10); // 读取10字节fs.read(fd, buffer, 0, 10, 0, (err, bytesRead, buf) => {if (err) throw err;console.log('读取字节数:', bytesRead);console.log('读取内容:', buf.toString('utf8', 0, bytesRead));fs.close(fd, (err) => {if (err) throw err;});});
});
 
3. fs.createReadStream()
 
-  
作用:创建一个可读流,适合大文件或流式处理
 -  
示例:
 
const fs = require('fs');const readStream = fs.createReadStream('example.txt', { encoding: 'utf8', highWaterMark: 16 * 1024 });readStream.on('data', (chunk) => {console.log('读取到数据块:', chunk);
});readStream.on('end', () => {console.log('读取完毕');
});readStream.on('error', (err) => {console.error('读取错误:', err);
});
 
4. fs.open() / fs.close()
 
-  
作用:打开文件,返回文件描述符(fd),用于更底层操作;操作结束后关闭文件
 -  
示例:
 
fs.open('example.txt', 'r', (err, fd) => {if (err) throw err;console.log('文件描述符:', fd);fs.close(fd, (err) => {if (err) throw err;console.log('文件已关闭');});
});
 
5. fs.readSync()
 
-  
同步版本的
fs.read(),基于 fd 读文件部分内容 -  
示例:
 
const fd = fs.openSync('example.txt', 'r');
const buffer = Buffer.alloc(10);
const bytesRead = fs.readSync(fd, buffer, 0, 10, 0);
console.log(buffer.toString('utf8', 0, bytesRead));
fs.closeSync(fd);
 
6. fs.readv() / fs.readvSync()(Node.js 12+)
 
-  
作用:一次读取多个 buffer(分散读)
 -  
相对较少用,进阶用法
 
7. 其它相关的文件读取与创建函数
| 函数 | 说明 | 同步/异步 | 
|---|---|---|
fs.writeFile() / fs.writeFileSync() | 写文件(覆盖写) | 异步/同步 | 
fs.appendFile() / fs.appendFileSync() | 追加写文件 | 异步/同步 | 
fs.createWriteStream() | 创建写流 | 适合大文件或流式写入 | 
fs.exists() / fs.existsSync() | 判断文件是否存在(不推荐,建议用 fs.stat) | 异步/同步 | 
fs.stat() / fs.statSync() | 获取文件信息(大小、时间等) | 异步/同步 | 
fs.readdir() / fs.readdirSync() | 读取目录下文件列表 | 异步/同步 | 
8. 结合 stream 读取文件示例
 
const fs = require('fs');
const { pipeline } = require('stream');const readStream = fs.createReadStream('example.txt', { encoding: 'utf8' });
readStream.on('data', (chunk) => {console.log('读取块:', chunk);
});
readStream.on('end', () => {console.log('读完了');
});
 
9. readline 模块按行读取大文件
 
const fs = require('fs');
const readline = require('readline');const rl = readline.createInterface({input: fs.createReadStream('example.txt'),crlfDelay: Infinity
});rl.on('line', (line) => {console.log(`一行: ${line}`);
});rl.on('close', () => {console.log('文件读取结束');
});
 
总结
-  
简单快速读小文件用
fs.readFile()或同步版本 -  
**读文件片段(低级)**用
fs.read()+fs.open() -  
大文件流式读用
fs.createReadStream() -  
按行读可以结合
readline模块 -  
底层操作使用
fs.open()、fs.read()、fs.close() 
如果你想,我还可以帮你整理写文件相关的函数用法,或者把流式读写结合的完整例子也给你,告诉我哈!
