당신이 당신의 네트워크에서 시스템 충돌 또는 멤버 중 하나의 경우 스트림의 손실을 방지하기 위해 데이터의 영구 저장소로 파일을 유지하려면 실행중인 프로세스가 종료되면 계속해서 파일에 쓰고 그 파일에서 읽을 수 있습니다.
이 파일을 Java 프로세스에서 생성 된 결과의 영구 저장소로 사용하지 않으려면 Unix 소켓을 사용하는 것이 용이함과 성능면에서 훨씬 좋습니다.
fs.watchFile()
은 파일 시스템이 파일을보고 할 때 파일 통계에서 작동하고 이미 작성된 파일을 읽고 싶어하기 때문에 사용자가 원하는 것이 아닙니다.
SHORT UPDATE :은 내가 이전 단락에서 파일 통계를 사용하는 fs.watchFile()
을 비난했다하더라도, 내가 아래에있는 내 예제 코드에서 똑같은 일이 자신을했던 것을 실현하기 위해 매우 유감스럽게 생각한다! 나는 이미 독자들에게 "주의를 기울여야한다"고 경고했지만. 테스트를 잘하지 않고도 몇 분 안에 작성했기 때문에. 여전히 기본 시스템에서 지원하는 경우 watchFile
또는 fstatSync
대신 fs.watch()
을 사용하면 더 효율적으로 수행 할 수 있습니다. 파일에서 읽기/쓰기를 들어
은, 난 그냥 내 휴식 시간에 재미를 위해 아래에 쓴 :
테스트-FS-writer.js : 당신이 당신의 자바 파일을 작성하기 때문에이 필요하지 않습니다 과정]
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