Se si desidera mantenere il file come un archivio permanente dei dati per evitare una perdita di flusso in caso di un crash di sistema o di uno dei membri della rete dei processi in esecuzione muore, puoi ancora continuare a scrivere su un file e leggerne il contenuto.
Se non si ha bisogno di questo file come memoria permanente dei risultati prodotti dal proprio processo Java, andare con un socket Unix è molto meglio sia per la facilità che per le prestazioni.
fs.watchFile()
non è quello che ti serve perché funziona su statistiche di file come il filesystem lo segnala e dal momento che vuoi leggere il file così come è già stato scritto, questo non è quello che vuoi.
BREVE UPDATE: Mi dispiace molto per rendersi conto che anche se avevo accusato fs.watchFile()
per l'utilizzo di statistiche di file nel paragrafo precedente, avevo fatto la stessa cosa me stesso nel mio codice di esempio qui sotto! Anche se avevo già avvertito i lettori di "prendersi cura!" perché l'avevo scritto in pochi minuti senza nemmeno testare bene; ancora, può essere fatto meglio usando fs.watch()
invece di watchFile
o fstatSync
se il sistema sottostante lo supporta.
per la lettura/scrittura da un file, ho appena scritto qui di seguito per divertimento nella mia pausa:
test-fs-writer.js: [Non avrete bisogno di questo dato si scrive file nel Java processo]
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);
});
prova-FS-reader.js: [Fate attenzione, questa è solo la dimostrazione, controllare gli oggetti ERR]
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);
}
!
È possibile evitare in modo sicuro l'utilizzo di nextTick
e chiamare direttamente readsome()
. Poiché stiamo ancora lavorando qui, non è necessario in nessun senso. Mi piace. : P
EDIT Oliver Lloyd
Prendendo l'esempio precedente, ma si estende per leggere dati CSV dà:
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);
}
Questo è un buon esempio che affronta direttamente la mia domanda. Richiederà comunque un miglioramento solo per elaborare una linea alla volta, ma probabilmente questa è una buona cosa; la mancanza di un'interfaccia fs esistente del nodo significa che è completamente personalizzabile, quindi anche se devo scrivere codice extra, posso ottenere esattamente ciò di cui ho bisogno. –
Ho esteso l'esempio sopra per lavorare con un file CSV. –
Funziona assolutamente quando viene eseguito come nodo ma come posso inserire questo codice in app.js e ottenere il risultato nella pagina html? –
sand