- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
据我所知,有两种规范的方法可以在 Node.js 中响应文件:
首先,我确信最常见的方法是将文件加载到内存中并转发回调的数据参数。例如:
if(stat && stat.isFile()){
fs.readFile(d,function(a,data){
response.writeHead(200,{
'Content-Type': 'text/plain'
});
response.write(data);
successCallback();
})
}
此外,还有一种在读取数据时通过管道传输数据的方法。例如:
var filePath = path.join(__dirname, 'myfile.mp3'),
stat = fileSystem.statSync(filePath),
readStream = fileSystem.createReadStream(filePath);
response.writeHead(200, {
'Content-Type': 'video/mp4',
'Content-Length': stat.size
});
readStream.pipe(response);
现在,显然后一种方法在内存节省方面具有明显的优势,特别是考虑到大文件或流。然而,它是最好的包罗万象的方法吗?在我处理(相对)较小但数量众多的文件(例如 HTML、脚本和位图)的情况下,我是否最好使用前一种教科书方法?
那么,出于所有意图和目的,幕后发生了什么,以及哪些环境开销可能会阻止我一直使用 readStreams(如果有的话)?
最佳答案
阅读 fs.readFile 的源代码和 fs.createReadStream分别,我会说createReadStream()
是更好的包罗万象的方法。无论大小如何,数据仍然必须从磁盘读取。但是,如果数据很大,则在发送之前分配缓冲存储器来存储数据会产生性能/资源损失。
ReadStream
在node
被优化为快速 - 它用于 http 响应和请求 node
太出名了。
在您不断重复发送有限数量的小文件的特定情况下,缓存数据具有优势。然后,您将读取带有 readFile
的所有文件。在应用程序启动时,将它们存储在哈希中,并在每次请求时直接从内存发送它们。如果您可以腾出内存,那么在请求周期期间避免所有文件系统总是最快的。
但作为一般规则,应尽快将数据通过管道传输到客户端,而无需中间内存存储。
关于javascript - 在 Node 中上传文件的管道与缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21538346/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!