Jmeter 自带的控件 Flexible Writer 可以记录许多信息到文件,但是只能记录原始信息,当我们需要后处理和稍复杂的逻辑时,就必须借助 Groovy 脚本 。 本文讨论如何用 Groovy 脚本读写文件。
本文使用的 Jmeter 是 4.0 版本
和 Java I/O 的关系
虽然 Groovy 插件完全兼容 Java,也就是说,你可以在 JSR233 插件中使用 Java 语言读写文件,但是, Groovy 语言提供了许多额外的方法,让你以极少量的代码完成 Java 中的同样的事情。
定位文件路径
启动 Jmeter 的目录,会被当做初始目录(Home directory)。在 Jmeter 里,单独一个文件名,默认是相对 Jmeter 初始目录。所以,如果文件放在初始目录下,是不需要指定路径的。
我们在 初始目录 内预先创建一个文件作为实验对象,文件名为 test.txt , 内容如下:
The quick
brown fox
jumps over
the lazy dog
如果要改变初始目录,需要用 -d
参数:
jmeter -d /some/dir
读取文件
用例设计如下:
Test Plan
└─ Thread Group
└─ JSR223 Sampler
将代码填入 JSR223 Sampler,执行便可在命令行里看到结果。
文件对象
内置 File 对象可以用来打开一个文件。
File f = new File(fileName);
逐行读取
eachLine
下面的代码将 test.txt 文件内容全部显示在控制台中:
String fileName = 'test.txt'; // 指定文件名
File f = new File(fileName); // 实例化 File 对象
f.eachLine{
line -> OUT.println(line);
}
eachLine 是 Groovy 在 Java 的 File 对象基础上新增的方法,用于方便的遍历文件的每一行,并且在结束遍历时,自动关闭文件(即使发生异常,仍然可以自动关闭),可以非常方便的用于逐行遍历文件内容。eachLine 后面用花括号括起来的参数是一个closure,类似一个匿名函数。
Closure 的第二个参数可忽略,如果带上则表示行号
String fileName = 'test.txt'; // 指定文件名
File f = new File(fileName); // 实例化 File 对象
f.eachLine{
line, lineNum -> OUT.println(lineNum +" "+ line);
}
读取到数组
collect
def list = new File('test.txt').collect {it}
OUT.println("\$list");
collect 后面的参数仍然是closure,it是默认参数,可以省略,而最后一行的return关键字也可以省略,所以{it}的意思就是将参数直接返回。等效于下面的closure:
{it} 等效于
{item -> return item}
或者使用 as
关键字,下面的语句和上面等效:
def array = new File('test.txt') as String[]
OUT.println("$array");
按字节方式读入文件
byte[]
def file = new File('test.txt');
byte[] contents = file.bytes;
OUT.println("$contents");
可以忘了 FileInputStream
了!(本来就难以记忆)
处理流
如果确实需要处理输入流,可以用下面的写法:
new File('test.txt').withInputStream { stream ->
// do something ...
}
## 写入文件 {#writefile}
未完待续如果您对本文有疑问或者寻求合作,欢迎 联系邮箱 。邮箱已到剪贴板
精彩评论
本站 是个人网站,采用 署名协议 CC-BY-NC 授权。
欢迎转载,请保留原文链接 https://www.lfhacks.com/tech/jmeter-read-and-write-file/ ,且不得用于商业用途。