如果你想保持文件作爲數據的持久化存儲,以防止流的損失在系統崩潰或成員之一的網絡中的情況下,正在運行的進程死亡後,您仍然可以繼續寫入文件並從中讀取數據。
如果您不需要此文件作爲您的Java進程生成結果的持久性存儲,那麼使用Unix套接字對於易用性和性能都要好得多。
fs.watchFile()
不是你所需要的,因爲它在文件系統報告時對文件統計信息起作用,並且由於你想讀取正在寫入的文件,所以這不是你想要的。
短的更新:我很抱歉地認識到,雖然我曾指責fs.watchFile()
在前面的段落使用文件統計,我做了我自己同樣的事情在我下面的示例代碼!儘管我已經告誡讀者「保重!」因爲我已經在幾分鐘內寫完了,甚至沒有經過很好的測試;但是,如果底層系統支持它,則可以通過使用fs.watch()
而不是watchFile
或fstatSync
來做得更好。
讀/從文件寫作,我剛纔寫下面的樂趣在我的休息:
測試-FS-writer.js:因爲你在Java編寫的文件你不會需要這個過程]
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);
});
測試-FS-reader.js:小心,這只是演示,檢查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);
}
!
您可以安全避免直接使用nextTick
並直接致電readsome()
。由於我們仍然在這裏同步工作,所以在任何意義上都沒有必要。我只是喜歡它。 :P
EDIT通過Oliver Lloyd
以上面的例子,但它延伸到讀CSV數據給出:
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);
}
這是直接解決我的問題的一個很好的例子。這需要加強,但一次只能處理一行,但可以說這是一件好事;節點缺乏現有的fs接口意味着它是完全可定製的,所以即使我必須編寫額外的代碼,我也可以實現我所需要的。 –
我擴展了上面的示例以使用CSV文件。 –
這在絕對當作節點運行,但我怎樣才能把這段代碼放在app.js中並在html頁面中得到結果呢? –
sand