如何终止winusb readpipeStream.pipe

nodejs版本 v0.10.15,用createReadStream始终没法下载文件,求…_nodejs吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:11,560贴子:
nodejs版本 v0.10.15,用createReadStream始终没法下载文件,求…收藏
尝试过各种办法,百度都翻了好几篇了。,还是没解决代码如下。filePath = "D:/web/4.jpg";function readFile(filePath,response){
filePath = path.join(filePath);var ContentTif(filePath.lastIndexOf(".") == -1)throw new Error("Directory is not support download!");var fileType = filePath.substring(filePath.lastIndexOf(".")+1);//文件类型ContentType = config.MIME_TYPES[fileType]||"application/octet-stream";fs.exists(filePath,function(exists){if (exists) {var rOption = {flags : 'r',encoding : null,fd: null,mode : 0666,autoClose: true}if(config.DEBUG)console.log("["+core.time()+"] GET files:"+filePath);var ReadStream = fs.createReadStream(filePath,rOption);ReadStream.on('data',function(data){response.write(data);});
//ReadStream.on("data",function(data)
//response.write(data);
//});ReadStream.on("error", function() {if(config.DEBUG)console.log("["+core.time()+"] read files:"+filePath+" has an error!");response.writeHead(404,{"Content-Type": "text/plain"}); response.end();});response.writeHead(200, {"Content-Type": ContentType});ReadStream.pipe(response);//response.write(filePath);ReadStream.on("end", function() {//数据发送完毕if(config.DEBUG)console.log("["+core.time()+"] read files:"+filePath+" success!");response.end();});}else{if(config.DEBUG)console.log("["+core.time()+"] files:"+filePath+" not exist!");response.writeHead(404,{"Content-Type": "text/plain"});response.end();}});}假如按上面那种方式,浏览器一片空白。没有任何图片下载或显示假如将ReadStream.pipe(response);注释掉将//ReadStream.on("data",function(data)//{
//response.write(data);//});解除注释,可以触发end方法。我确定文件存在的。因为console.log("["+core.time()+"] GET files:"+filePath);这句可以在cmd中显示出来response.write(data);始终返回的null是不是这个版本的api有问题阿。为什么一直都不行呢?还是说有其他的问题?
登录百度帐号推荐应用读了一下午源代码,作者写的代码太难懂了,洋洋洒洒,勉强看懂。
ReadStream有两个模式,即flow模式和readable模式,一旦设定成一种模式,最好不要切换成另一种。
flow模式采用好处是可以控制速度,常见用法为
readable.on(&data&,function(data){
var ret = writable.write(data);
readable.pause();//暂停stream,将readable.flow=false
writable.once('drain',function(){
readable.resume(); //让readble继续干活。resume其实就是把readable.flow设置成true,然后调用后文所说的flow()方法。
readable.on(&end&,function());//do whatever you want
而readable模式则需要查看read方法的返回值,read()返回null,整个读取即告结束
readable.on(&readable&,function()){
while((ret = readable.read()) != null){
readable.on(&end&,function(){
console.log(&end&);
当一个stream被on(&readable&)后,他就进入readable模式,readable模式会查看当前buffer里是否有数据(数据可能在调用on(&readable&前就被push好了),如果有,直接调用read(),如果没有调用read(0); read(0)不会真正从buffer上把数据拿下来,但是她可能会从resource上下载数据。
其实还有一个.pipe模式,这也是node官方推荐的,她就是帮我们把on('data')包了一层,然后加入了速度控制。
1.当一个stream被调用了on(&data&,..)后,即进入flow模式。
2.stream.flow被设置成true,并且调用resume方法,下图是resume方法的截图
function resume(stream, state) {
if (!state.resumeScheduled) {
state.resumeScheduled =
processNextTick(resume_, stream, state);
function resume_(stream, state) {
if (!state.reading) {
debug('resume read 0');
stream.read(0);
state.resumeScheduled =
stream.emit('resume');
flow(stream);
if (state.flowing && !state.reading) stream.read(0);
可以看到,最终boss是这个flow方法。
function flow(stream) {
var state = stream._readableS
debug('flow', state.flowing);
if (state.flowing) {
var chunk = stream.read();
} while (null !== chunk && state.flowing);
3.flow模式会首先尝试不断调用read(),直至他返回null位置。一般情况下,异步获取资源,read()很容易在第一次就返回null。
我一开始的疑问是,这样的话,整个流程不就结束了?
.但是,仔细思考一下那个就能明白,首先这里的stream.read()是同步调用方式,这和stream的异步有矛盾。但是通过读read代码可以发现,他会调用_read,而_read在读取完数据会会调用push,push会把整个flow从新激活起来。
4.还有一点,这里read()方法的返回值,我们根本没有哪里可以用啊。实际上,read()方法不仅返回读取到的值,还会发送&data&时间,下图是read()方法的最后几行。
if (ret !== null)
this.emit('data', ret);
让我们仔细看一下read方法的大致语义
注:readstream中有一个highWaterMark,他只是一个参考值,实际buffer大小可以大于这个值。因此buffer.length和highWaterMark要区别对待!
a.首先决定要从缓存中读多少数据, 如果当前传入的n小于当前stream的buffer里的值,就可以把缓存中的那部分数据给取出来。那么就读取n个字节。
如果不传参数,那么直接把buffer里所有的全部都拿出来。读取的字节数=现在缓存里有的,n=buffer.length
如果传入的参数&当前buffer的大小,此次read失效,不读取,n=0。
决定完后这个数值假设它是n。
b.决定完n后,看看当前buffer.length-n之后是否大于等于highWaterMark。如果是的话,就没必要从resource(可能是硬盘,可能是网络)上读取新的东西了,直接用buffe里就足够了,反正后续的read()方法也会消耗buffer。
c. 如果buffer.length-n & highWaterMark&的话,那么这时候就要调用_read方法,从resource上读东西了,这个过程是异步的。
5.一般_read方法要求我们把数据读完后调用push方法,这个方法大致实现如下。可以看到,他会新数据push到buffer里,还会发送readable时间,然后通过flow方法把整个flow重新激活。
state.length += state.objectMode ? 1 : chunk.
if (addToFront)
state.buffer.unshift(chunk);
state.buffer.push(chunk);
if (state.needReadable){
stream.emit('readable');
flow(stream);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6063次
排名:千里之外
原创:21篇
(1)(1)(1)(1)(2)(2)(4)(2)(3)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'HTTP 404 - SegmentFault
HTTP 404……可能这个页面已经飞走了

我要回帖

更多关于 c readline 终止 的文章

 

随机推荐