1 写在前面
在写 Logstash 插件的过程中,借鉴和学习到一些 JRuby 的书写技巧,随手记录一下,仅供参考。
混入防转防爬防抄袭声明:本文《Logstash 插件(JRuby)-文件操作》首发且仅发布于没有名字的博客
2 文件操作
写过需要在内存中统计数据的插件,为了防止服务重启或宕机导致丢数据,也实现了一个比较简陋的持久化,就是定时将内存中的数据写入本地文件,如果遇到宕机重启,则在插件初始化时从本地文件中读取之前的统计数据。
2.1 新建/打开文件
判断文件是否已存在,如果存在,直接打开,如果不存在,则新建。
if File.exist?(@file_path)
persist_file = File.open(@file_path, "w+")
else
persist_file = File.new(@file_path, "w+")
end
第二个参数为文件的模式,常用如下:
r
:只读,从文件开头开始,默认模式。
r+
:读写,从文件开头开始。
w
:只写,将现有文件的长度截断为 0 或新建一个文件进行写入。
w+
:读写,将现有文件的长度截断为 0 或新建一个文件进行读写。
a
:只写,每次写入都在文件末尾追加,如果文件不存在,则新建。
a+
:读写,每次写入都在文件末尾追加,如果文件不存在,则新建。
2.3 读文件
方法挺多的,如前面所讲,我需要在 Logstash 启动,初始化插件时,从文件中读出之前保存的信息,还原内存中的统计结果,所以可以直接这么写:
str = File.open(@file_path, &:readline)
使用&
指定一个代码块,这里使用的是 IO 的 readline 方法,就可以打开文件的同时,直接获取一行内容,并且不需要手动关闭文件。
其他的读文件内容的写法还有:
# 读取所有行,到一个数组中
IO.readlines(@file_path)
# 或直接遍历
File.foreach(@file_path).with_index do |line, line_no|
puts "#{line_no}: #{line}"
end
2.4 写文件
persist_file.write(str)