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} (未完待续)