ağınızdaki bir sistem çökmesi veya üyelerden birinin durumunda akışının bir kaybını önlemek için verilerinizin kalıcı deposu olarak dosyayı tutmak istiyorsanız Çalışan süreçlerin ölmesi durumunda, bir dosyaya yazmaya devam edip ondan okumaya devam edebilirsiniz.
Bu dosyayı, Java işleminizden üretilen sonuçların kalıcı bir şekilde saklanması gerekmiyorsa, Unix soketine sahip olmak hem kolaylık hem de performans açısından çok daha iyidir.
fs.watchFile()
dosya sistemi bunu raporları gibi dosya istatistikleri üzerinde çalıştığı için size gereken ve bunu zaten yazılırken dosyayı okumak istiyorum, çünkü istediğin bu değil ne değildir.
KISA GÜNCELLEME: Ben önceki paragrafta dosya istatistikleri kullanarak fs.watchFile()
itham rağmen, aşağıda benim örnek kodda aynı şeyi kendim yapmış olduğunu fark etmek çok üzgünüm! Her ne kadar okuyucuları "dikkat et" konusunda uyarmıştım. çünkü iyi test etmeden sadece birkaç dakika içinde yazmıştım; hala, sistem destekliyorsa watchFile
veya fstatSync
yerine fs.watch()
kullanarak daha iyi yapılabilir. Bir dosyadan yazma/okuma için
, ben sadece benim mola eğlenmek için aşağıda yazdım:
test fs-writer.js: Eğer Java dosyası yazmak beri [Buna gerek kalmayacak süreç]
var fs = require('fs'),
lineno=0;
var stream = fs.createWriteStream('test-read-write.txt', {flags:'a'});
stream.on('open', function() {
console.log('Stream opened, will start writing in 2 secs');
setInterval(function() { stream.write((++lineno)+' oi!\n'); }, 2000);
});
test fs-reader.js: [Kendine iyi bak, bu sadece gösteri err nesneleri kontrol dir]
var fs = require('fs'),
bite_size = 256,
readbytes = 0,
file;
fs.open('test-read-write.txt', 'r', function(err, fd) { file = fd; readsome(); });
function readsome() {
var stats = fs.fstatSync(file); // yes sometimes async does not make sense!
if(stats.size<readbytes+1) {
console.log('Hehe I am much faster than your writer..! I will sleep for a while, I deserve it!');
setTimeout(readsome, 3000);
}
else {
fs.read(file, new Buffer(bite_size), 0, bite_size, readbytes, processsome);
}
}
function processsome(err, bytecount, buff) {
console.log('Read', bytecount, 'and will process it now.');
// Here we will process our incoming data:
// Do whatever you need. Just be careful about not using beyond the bytecount in buff.
console.log(buff.toString('utf-8', 0, bytecount));
// So we continue reading from where we left:
readbytes+=bytecount;
process.nextTick(readsome);
}
!
nextTick
'u güvenle kullanmaktan kaçının ve bunun yerine readsome()
numaralı telefonu arayın. Hala burada senkronizasyon yaptığımız için, herhangi bir anlamda gerekli değildir. Sadece beğendim. : P
DÜZENLEME Oliver Lloyd
Yukarıdaki örnek alınarak ancak CSV veri okumak için genişleterek verir:
var lastLineFeed,
lineArray;
function processsome(err, bytecount, buff) {
lastLineFeed = buff.toString('utf-8', 0, bytecount).lastIndexOf('\n');
if(lastLineFeed > -1){
// Split the buffer by line
lineArray = buff.toString('utf-8', 0, bytecount).slice(0,lastLineFeed).split('\n');
// Then split each line by comma
for(i=0;i<lineArray.length;i++){
// Add read rows to an array for use elsewhere
valueArray.push(lineArray[i].split(','));
}
// Set a new position to read from
readbytes+=lastLineFeed+1;
} else {
// No complete lines were read
readbytes+=bytecount;
}
process.nextTick(readFile);
}
Bu, sorumu doğrudan adresleyen iyi bir örnektir. Her seferinde sadece bir satırı işlemek için geliştirmeyi gerektirir, ancak tartışmasız bu iyi bir şeydir; Düğümün mevcut fs arabiriminin olmaması, tamamen kodlanabilir olması gerektiğinden, tam kod yazmam gerekirse bile, tam ihtiyacım olanı elde edebilirim. –
Yukarıdaki örneği bir CSV dosyasıyla çalışmak için genişlettim. –
Bu, düğümü olarak çalıştırıldığında kesinlikle çalışır, ancak bu kodu app.js'ye nasıl koyabilirim ve sonucu html sayfasında alabilir miyim? –
sand