Java реализация IO unix/linux “хвост-f”

Я думаю, вы должны изменить экспресс-код на это, это будет намного эффективнее.

router.post("/:id/proxies", async (req, res) => {
    // req.body.proxies contains the array that needs to be pushed in the proxies array 
    // addToSet makes sure that the elements are not repeated   
    await Project.findByIdAndUpdate(req.params.id, { $addToSet: { proxies: req.body.proxies } });
    res.end();
});
69
задан Chirlo 10 March 2016 в 13:32
поделиться

3 ответа

Способность продолжить читать файл и ожидать вокруг до файла имеет еще некоторые обновления для Вас, не должен быть то, что трудно выполнить в коде самих. Вот некоторый псевдокод:

BufferedReader br = new BufferedReader(...);
String line;
while (keepReading) {
    line = reader.readLine();
    if (line == null) {
        //wait until there is more of the file for us to read
        Thread.sleep(1000);
    }
    else {
        //do something interesting with the line
    }
}

я предположил бы, что Вы захотите поместить этот тип функциональности в его собственном Потоке, так, чтобы можно было спать он и не влиять на любые другие области применения. Вы хотели бы выставить keepReading в методе set так, чтобы Ваш основной класс / другие части приложения мог безопасно завершить работу потока без любых других головных болей, просто путем вызова stopReading() или что-то подобное.

36
ответ дан Michael Myers 24 November 2019 в 13:50
поделиться

Проверьте JLogTailer, который делает эту логику.

основной момент в коде:

public void run() {
    try {
        while (_running) {
            Thread.sleep(_updateInterval);
            long len = _file.length();
            if (len < _filePointer) {
                // Log must have been jibbled or deleted.
                this.appendMessage("Log file was reset. Restarting logging from start of file.");
                _filePointer = len;
            }
            else if (len > _filePointer) {
                // File must have had something added to it!
                RandomAccessFile raf = new RandomAccessFile(_file, "r");
                raf.seek(_filePointer);
                String line = null;
                while ((line = raf.readLine()) != null) {
                    this.appendLine(line);
                }
                _filePointer = raf.getFilePointer();
                raf.close();
            }
        }
    }
    catch (Exception e) {
        this.appendMessage("Fatal error reading log file, log tailing has stopped.");
    }
    // dispose();
}
12
ответ дан Karussell 24 November 2019 в 13:50
поделиться

Вот рассказ, который Вы могли использовать в качестве указателя:

я кодировал TailingInputStream на работе по той же самой причине. Это в основном использует Файл и обновило его содержание по требованию и проверило по внутреннему буферу, если это значительно изменило (штамп памяти 4 КБ IIRC) и затем сделало то, что делает хвост-f. Немного hacky, да, но это работает отлично и не смешивает с Потоками, или что-либо полагает как этот - это совместимо полностью назад с 1.4.2, по крайней мере.

Тем не менее было намного легче сделать, чем ReverseInputStream, который пошел от конца файла для запуска и не умер, если файл был обновлен на лету...

0
ответ дан Esko 24 November 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: