Wenn Sie die Datei als persistenter Speicher Ihrer Daten behalten wollen einen Verlust von Strom im Fall eines Systemabsturzes oder eines der Mitglieder in Ihrem Netzwerk zu verhindern Wenn Prozesse ablaufen, können Sie weiterhin in eine Datei schreiben und daraus lesen.
Wenn Sie diese Datei nicht als persistenten Speicher der produzierten Ergebnisse aus Ihrem Java-Prozess benötigen, dann ist die Verwendung eines Unix-Sockels viel besser für die Leichtigkeit und auch die Leistung.
fs.watchFile()
ist nicht das, was Sie brauchen, weil es auf Dateistats arbeitet, da Dateisystem es meldet, und da Sie die Datei lesen möchten, wie es bereits geschrieben wird, ist das nicht was Sie wollen.
SHORT UPDATE: Ich bin sehr traurig, zu erkennen, dass, obwohl ich fs.watchFile()
für die Verwendung von Datei-Statistik in vorherigem Absatz beschuldigt hatte, ich die gleiche Sache selbst in meinem Beispiel-Code unten getan hatte! Obwohl ich die Leser bereits gewarnt hatte, "mach's gut!" weil ich es in nur wenigen Minuten geschrieben hatte, ohne es gut zu testen; Dennoch kann es besser mit fs.watch()
anstelle von watchFile
oder fstatSync
getan werden, wenn das zugrunde liegende System es unterstützt.
Zum Lesen/aus einer Datei zu schreiben, habe ich nur unten in meiner Pause zum Spaß geschrieben:
Test-fs-writer.js: [Sie brauchen das nicht, da Sie Datei in Ihrem Java schreiben Prozess]
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: [Achten Sie darauf, das ist nur Demonstration, err Objekte überprüfen]
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);
}
!
Sie können die Verwendung von nextTick
vermeiden und stattdessen direkt readsome()
anrufen. Da wir hier immer noch synchron arbeiten, ist es in keiner Hinsicht notwendig. Ich mag es einfach. : P
EDIT von Oliver Lloyd
Nehmen wir das Beispiel oben, aber es zu lesen CSV-Daten erstrecken gibt:
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);
}
Dies ist ein gutes Beispiel, das meine Frage direkt anspricht. Es erfordert jedoch eine Verbesserung, nur eine Zeile zu einer Zeit zu verarbeiten, aber das ist wohl eine gute Sache. Knoten Mangel an vorhandenen fs-Schnittstelle bedeutet, dass es vollständig anpassbar ist, so dass selbst wenn ich extra Code schreiben muss, kann ich genau das erreichen, was ich brauche. –
Ich habe das obige Beispiel erweitert, um mit einer CSV-Datei zu arbeiten. –
Dies funktioniert absolut, wenn es als Knoten ausgeführt wird, aber wie kann ich diesen Code in app.js einfügen und das Ergebnis in HTML-Seite bekommen? –
sand