如何使用rx-java尾部文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用rx-java尾部文件?相关的知识,希望对你有一定的参考价值。

使用rx-java软件包,我如何tail一个文件?

代码:

package tail;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.Logger;

public class FileUtils 

    public FileUtils() 
    

    public void readFromInputStream(InputStream inputStream)
            throws IOException 
        StringBuilder resultStringBuilder = new StringBuilder();
        try (BufferedReader br
                = new BufferedReader(new InputStreamReader(inputStream))) 
            String line;
            while ((line = br.readLine()) != null) 
                resultStringBuilder.append(line).append("\n");
            
        
        System.out.println(resultStringBuilder);
    


我想将each line解析为写入文件中。首先,需要从Java到equivalenttail -f foo.log

答案

我不确定要专门使用RxJava。但是您可以采用通用的Java解决方案,并与RxJava结合使用。当然,这取决于您希望如何得到通知。

一个基本选项是使用打开的InputStream(或某些流包装器类或阅读器类)来尾部文件。使用正在运行的线程,您可以使用InputStream.read等待文件,或者使用InputStream.available采样新字节数。在RxJava中,可以使用IO调度程序。阅读完整行后,只需从线程中调用一些观察者即可。

在核心Java中,它可能类似于:

class ObserveTask implements Runnable 

    private File file;
    private Listener listener;

    @Override
    public void run() 
        try (InputStream stream = new FileInputStream(file); 
            BufferedReader reader = new BufferedReader(stream)) 
            while (!Thread.interrupted()) 
                String line = reader.readLine();
                listener.onNewLine(line);
            
        
    

现在只需运行任务:

Scheduler scheduler = Schedulers.newThread();
Scheduler.Worker worker = scheduler.createWorker();
worker.schedule(new ObserveTask());

当然,这只是一个基本示例。

您可以将任务拆分为多个部分,每次运行时都会检查字节,同时流保持打开状态。当然,这很危险,因为这样打开流可能会导致泄漏。

更高级的解决方案可以包括使用WatchService

以上是关于如何使用rx-java尾部文件?的主要内容,如果未能解决你的问题,请参考以下文章

RX-JAVA distinct debounce defer merge

RX-JAVA distinct debounce defer merge

如何使用 webapp2 使尾部斜杠可选?

如何使用纯 CSS 创建“工具提示尾部”?

如何在HTML不同的页面中,共用头部与尾部?

如何实时查看linux下的日志