Как я уже сказал в своем комментарии: Writestream может делать свою собственную буферизацию для более эффективной записи на диск. Вы не можете гарантировать, что все было записано на диск из потока, пока вы либо не заставите поток выполнить flu sh свои записи (и дождитесь завершения flu sh до fini sh), либо пока вы не закроете поток (и подождите, пока не будет завершено закрытие).
Ваше решение по тайм-ауту немного взломано и не совсем так, как вы должны поступать. Вы действительно должны прислушиваться к тому, когда поток фактически выполняется (управляется событиями), а не просто выбирать время ожидания.
Вы можете использовать обработчик событий, например так:
output.on('close', readAfter);
, чтобы сделать который. В этом примере событие close
или finish
будет работать нормально, так как оба события происходят после того, как данные были сброшены в базовую операционную систему. Событие close
происходит немного позже в цикле, когда фактический ресурс файла ОС был подтвержден как закрытый, что мне кажется самым безопасным вариантом.
Вот весь ваш блок кода со вставленным и setTimeout()
удалено.
//create a writeable stream for our Console instance as stdout
const fs = require('fs');
let output = fs.createWriteStream('./output.txt');
output.write('c1:1\n');
output.write('c1:2\n');
output.write('default:1\n');
// register an event handler for when the stream is closed and all data has been flushed to disk
output.on('close', readAfter);
output.end(); //close the writable stream
function readAfter(){
//read the file synchronously
let read = fs.readFileSync('./output.txt','utf8');
console.log(`read the output file synchronously: \n${read}`);
//read the test file synchronously
let readTest = fs.readFileSync('./test.txt','utf8');
console.log(`read the test file synchronously: \n${readTest}`);
//read the file asynchronously
let readAsync = fs.readFile('./output.txt','utf8',(err,data)=>{
console.log(`read the file asynchronously: \n${data}`);
});
//read the test file asynchronously
let readTestAsync = fs.readFile('./test.txt','utf8',(err,data)=>{
console.log(`read the test file asynchronously: \n${data}`);
});
//read the file with fs.createReadStream
let stream = fs.createReadStream('./output.txt','utf8');
let readWithStream = "";
stream.on('data',(data)=>{
readWithStream += data;
});
stream.on('end',(data)=>{
console.log(`read the file with fs.createReadStream : \n${readWithStream}`);
});
//read the test file with fs.createReadStream
let streamTest = fs.createReadStream('./test.txt','utf8');
let readTestWithStream = "";
streamTest.on('data',(data)=>{
readTestWithStream += data;
});
streamTest.on('end',(data)=>{
console.log(`read the test file with fs.createReadStream : \n${readTestWithStream}`);
});
};