【问题标题】:Where does readstream stores the file in nodejsreadstream在nodejs中将文件存储在哪里
【发布时间】:2019-05-15 13:15:03
【问题描述】:

我读到createRreadStream 不会将整个文件放入内存,而是使用块。但是,我有一种情况,我同时在文件中写入和读取;写入首先完成,然后我从磁盘中删除文件。不知何故,readstream 能够完成读取整个文件而没有任何错误。

有人对此有任何解释吗?我认为流不会将文件加载到内存中是错误的吗?

这是写入文件的代码

const fs = require('fs');
const file = fs.createWriteStream('./bigFile4.txt');

function write(stream,data) {
  if(!stream.write(data))
      return new Promise(resolve=>stream.once('drain',resolve));
  return true;
}

(async() => {
  for(let i=0; i<1e6; i++) {
     const res = write(file,'a')
     if(res instanceof Promise)
       await res;
     }
  write(file,'success');
})();

为了阅读,我使用了这个,

const file = fs.createReadStream('bigFile4.txt')

file.on('data',(chunk)=>{
  console.log(chunk.toString())  
}) 

file.on('end',()=>{
  console.log('done')
})

【问题讨论】:

  • 您能否发布您的代码,以便我们尝试看看那里发生了什么?
  • 什么版本的节点?
  • 你应该在节点流中阅读backpressuring
  • @smac89,我使用的是节点版本 8.11.3 另外,我阅读了有关背压的信息,但无法弄清楚这里有什么帮助。我已经更新了问题(添加了代码),也许你可以看看。
  • @Mirakurun 完成

标签: javascript node.js stream fs


【解决方案1】:

至少在 UNIX 类型的操作系统上,如果您打开一个文件然后将其删除,那么在您关闭文件之前,该文件数据仍然可以读取。

【讨论】:

  • 不就相当于把文件的内容存入内存吗?我试图避免这种情况。因为大文件,往往会抛出内存不足的错误
  • 不,数据仍在从文件系统中读取,它没有存储在内存中。
  • 如果文件本身不再存在,如何从文件系统中读取数据?您能否解释一下它背后的工作原理,或者将我指向一个我可以更了解它的资源。谢谢
  • remove(3) 手册页以相对容易理解的方式对其进行了解释:“如果名称是文件的最后一个链接,但任何进程仍然打开文件,该文件将一直存在,直到最后一个引用它的文件描述符被关闭。” 因此,即使您无法看到该文件,也不意味着它数据已被删除。它将一直分配在文件系统上,直到最后一个进程处理完该文件。
  • 好的。明白了。您是否知道 Windows 操作系统是否也是如此?
猜你喜欢
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
相关资源
最近更新 更多