JMeter Logo

Jmeter 用 Groovy 读写文件

原创 2018年 10月 22日
标签: JMETER
本文发布至今已有6年零29天,可能不再适用,请谨慎对待。

先打个广告:欢迎关注我的公众号,参与 文史大挑战 趣味题目。使用方法见 这篇文章

公众号:晚花行乐

正文开始:

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}


未完待续

如果您对本文有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

标签: JMETER
给个免费的赞吧~

精彩评论

本站 是个人网站,采用 署名协议 CC-BY-NC 授权。
欢迎转载,请保留原文链接 https://www.lfhacks.com/tech/jmeter-read-and-write-file/ ,且不得用于商业用途。