- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我要上传(流)控制写入过程。但是写入过程总是返回false。大文件上传过程停止。代码输出结果如下;
> Node app.js
> False
> False
> False
> False
我做错了什么?
我的代码;
应用程序.js
var http = require('http');
var fs = require('fs');
http.createServer(function(req, res){
var readable = fs.createReadStream('read.mkv');
var writable = fs.createWriteStream('write.mkv');
readable.on('data', function(chunk){
var buffer = writable.write(chunk);
if(!buffer){ // ----> Always false! Why????
readable.pause();
}
console.log(buffer);
});
writable.on('drain', function(){
readable.resume();
});
}).listen(8090);
最佳答案
我已修改您的程序以显示有关正在发生的事情的更多信息:
'use strict';
const fs = require('fs');
const readable = fs.createReadStream('read.mkv');
const writable = fs.createWriteStream('write.mkv');
readable.on('data', function(chunk){
var buffer = writable.write(chunk);
if(!buffer){ // ----> Always false! Why????
readable.pause();
}
console.log(buffer, chunk.length);
});
writable.on('drain', function(){
readable.resume();
console.log('drain');
});
输出:
$ node blah.js
false 65536
drain
false 65536
drain
false 65536
drain
true 8192
我还使用了一个不同大小的文件作为输入,所以我有一个 true
在我的输出结束时。如果我增加我的 read.mkv
的大小,例如 10000
字节,最后一行将显示为 false 18192
.
发生的事情是 read()
返回的每个 block 足够大,导致写入流超过其 highWaterMark
默认为 16384
(假设 fs.createWriteStream
返回的流)。从输出中的数字可以看出,每个 read()
(错误,每个 'data'
事件)产生 65536
除最后一个字节外的字节。由于将此数据量写入 writable
导致它超过其 highWaterMark
, 该流建议等待 'drain'
在继续之前。
所以,很简单,您总是看到 false
发射是因为 readable
流在读取时会产生如此大的 block 。我希望不再看到任何日志表明传输已完成。但是你真的需要注册 .on('end')
和 .on('error')
弄清楚这一点。
对于像这样的简单情况,使用 readable.pipe()
确实更好。 ,比如:
readable.pipe(writable);
这会自动处理'drain'
为你。它甚至会调用 writable.end()
适合你。
请注意 pipe()
不会调用writable.end()
如果遇到读取或写入错误。如果您有一个长时间运行的进程需要对流错误具有弹性,那么如果您的程序运行时间足以达到文件描述符限制,则需要确保处理错误并关闭流以防止句柄泄漏。
false
手段Streams 使程序能够通过一次处理一个 block 而不是将其全部加载到内存中来扩展到大量数据。在数据最终写出之前,流可以组织成表示数据各种转换的管道。当write()
返回 false
,它表示它已收到足够的数据以使其忙碌一段时间。如果你继续向它发送 block ,它会继续接受这些 block 。但是,它的数据积压将增长并开始消耗更多内存。如果你忽略这个返回值并继续从一个非常大的源发送数据,你甚至可能导致程序耗尽它的地址空间并崩溃或卡住。为了保持代码的可扩展性,您应该尊重 false
返回并等待'drain
' 就像您在代码中所做的那样。
然而,false
并不意味着发生了任何不好的事情或有任何错误。事实上,在源流比目标流快的任何情况下,这种情况都是预期会发生的,这也是流 API 确保事情安全的方式。
关于javascript - Node.js writable.write 返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33026112/
我正在执行 UPDATE .WRITE() 语句,并发现它显然只有在您像这样定义它时才有效: string sql = "UPDATE [dbo].[Table] SET [Column].WRITE
我在 Unix 系统上用 C 编程。我知道: write(fd,"ABCD",4); 比这样做更好: write(fd, "A", 1); write(fd, "B", 1); write(fd, "
func hash(s string) uint32 { h := fnv.New32a() h.Write([]byte(s)) return h.Sum32() } 对于这
在经典的 asp 页面中,有人告诉我您可以使用 vbscript 或 jscript。而 jscript 就是 javascript。 所以我不确定 Response.Write、Response.W
当 openssl 子进程尝试 write() 到本地目录时,我收到此错误。在调用 write() 之前连接已关闭。它没有与 ssl 连接,因为我什至无法从 nodejs 文档启动示例代码。 我错过了
最近我在试验netty。我遇到了以下问题: ctx.channel().write(new TextWebSocketFrame("hello")) 没有在客户端返回 hello,但是 ctx.cha
请解释以下内容: def feed(data): import os print "DATA LEN: %s" % len(data) f = open("copy", "w") f.
有什么区别debug.write 和 Trace.write ?每个应该什么时候使用? 最佳答案 在典型的发布构建配置中,Debug class 被禁用并且什么都不做。 Trace但是,仍然可以在发行
我只是想知道,就性能而言,哪个更好(我在 FileStream 中使用 StreamWriter): 多次调用 Stream.Write(): StreamWriter sw = new Stream
我发现自己写给 stringwriter,然后在函数末尾执行 resp.Write(sw.ToString())。这是不必要的吗?如果我多次使用 HttpResponse.Write,即使我的页面是
我正在尝试通过 JavaScript 文件从 electron 打开一个新窗口,它可以工作,并打开了新窗口,但我无法将 HTML/文本写入新文件。我收到那个错误: Cannot read proper
我们对 QIODevice::write 的一般行为和具体的 QTcpSocket 实现感到非常困惑。有一个 similar question已经,但答案并不令人满意。主要的混淆源于分别提到的 byt
我知道这听起来像是一个愚蠢的问题: write(*,*) 和 write(6,*) ?我在我研究所的 super 计算机上运行一个复杂的代码,它通过一个不同于 6 的单元号输出一个数据文件,显然编译的
我有一个结构体,它可以通过一系列复杂的方法调用转换为文本,其中包含大量 write!调用。此文本可以写入文件或调试日志。我正在决定是否使用 fmt::Write 或 io::Write .我不能真正使
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
In the C standard library, an output can't be followed by an input and vice versa. 对于Linux API,可以在re
我希望能够为一件事做 document.write。然后延迟半秒,然后再记录。写一些。你知道这是否可能吗?而且,如果是这样,怎么办?到目前为止,我已经尝试过了,但没有奏效: document.writ
为什么通过 onclick 属性调用的 write() 函数解析为 document.write() 并替换文档?有什么办法可以阻止这种情况发生吗? Write Function Alternat
我想创建一个包含多个“页面”的文本文件,并将每个页面的字节偏移量记录在一个单独的文件中。为此,我将字符串打印到主输出文件并使用 bytes_written += file.write(str) 计算字
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!