使用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到equivalent到tail -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
。