File 如何将Groovy中的文件读入字符串?

File 如何将Groovy中的文件读入字符串?,file,groovy,File,Groovy,我需要从文件系统读取一个文件,并将整个内容加载到groovy控制器中的字符串中,最简单的方法是什么 这意味着你可以: 新文件(文件名).text String fileContents = new File('/path/to/file').text 如果需要指定字符编码,请使用以下选项: String fileContents = new File('/path/to/file').getText('UTF-8') 稍有变化 new File('/path/to/file').eachL

我需要从文件系统读取一个文件,并将整个内容加载到groovy控制器中的字符串中,最简单的方法是什么

这意味着你可以:

新文件(文件名).text

String fileContents = new File('/path/to/file').text
如果需要指定字符编码,请使用以下选项:

String fileContents = new File('/path/to/file').getText('UTF-8')
稍有变化

new File('/path/to/file').eachLine { line ->
  println line
}

最短的路确实是公正的

String fileContents = new File('/path/to/file').text
但在这种情况下,您无法控制文件中的字节如何解释为字符。AFAIK groovy试图通过查看文件内容来猜测这里的编码

如果需要特定的字符编码,可以使用

String fileContents = new File('/path/to/file').getText('UTF-8')

请参阅以获取进一步的参考。

在这里,您可以找到其他方法来执行相同的操作

读取文件

File file1 = new File("C:\Build\myfolder\myTestfile.txt");
def String yourData = file1.readLines();
读取完整文件

File file1 = new File("C:\Build\myfolder\myfile.txt");
def String yourData= file1.getText();
逐行读取文件

File file1 = new File("C:\Build\myfolder\myTestfile.txt");
for (def i=0;i<=30;i++) // specify how many line need to read eg.. 30
{
 log.info file1.readLines().get(i)

}
在我的例子中,
newfile()
不起作用,它在Jenkins管道作业中运行时会导致
FileNotFoundException
。下面的代码解决了这个问题,在我看来更容易:

def fileContents = readFile "path/to/file"

我仍然不完全理解这种差异,但也许它会帮助其他有同样困难的人。可能是因为
new File()
在执行groovy代码的系统上创建了一个文件,而这个系统与包含我想要读取的文件的系统不同。

这就是groovy的妙处:)我必须执行一些close()语句吗,还是阅读器会被getText()关闭方法?@dasKeks我认为可以安全地假设此方法的实现关闭了所有必要的资源。无论如何,您无法访问任何可能创建的读取器,因此无法关闭itI。我想指出的是,即使
文件
对象源自普通java jar,这种方法也可以工作。我不确定Groovy是否有自己的带有
text
属性的特殊
File
类,或者其他什么,但似乎
File
对象来自哪里并不重要,不管它是由Groovy代码还是Java代码实例化的。@roens这没有意义。我怀疑混合中还有其他一些因素,比如你有一个局部变量隐藏了一个字段或类似的东西。+1推荐使用编码参数的版本。普通的
someFile.text
不会做出明智的猜测,它只是在Groovy的最新版本中使用平台默认编码(在现代Linux上通常是UTF-8,但在windows/Mac OS上类似于windows-1252或MacRoman,除非您已经用
-Dfile.encoding=…
覆盖它),猜测是使用进行智能猜测的方法完成的。没错,但捕获“记录”仍然是一个有用的习惯用法。看到这一点是件好事——使逐行处理文件变得微不足道。readFile步骤对您来说合适吗?对我来说,它是有效的,但它在一些单词上使用了“单引号”,我不明白!它对我来说很好,并且没有遇到任何我没有放在自己的地方的引用(我猜你指的是文件内容中的引用)。也许值得为此提出一个新问题?在这种情况下,请尝试指定引号出现的情况以及正确的位置。适用于jenkins。因为readFile是一个内部关键字,不需要任何导入或来自jenkins管理员的额外批准。整个文件可以在String var中读取,然后通过以下代码打印:
String fp\u f=readFile(“任何文件”),如果(fp.length()){currentBuild.description=fp}
,如果未找到文件,则存在错误.Btw。原因是,新文件()在您的计算机上查找文件,就像Jenkins中的readFile在java虚拟机的groovy沙箱中查找一样,管道中的东西可能正在运行。。。此外,您还可以在沙盒管道中使用readfile,但默认情况下不允许使用File(),在使用该文件之前,您必须在Jenkins设置中列出白名单。我不确定您在指定类型时是否需要
def
。如果不使用def代码,则可以工作,我有定义这些变量的习惯!我喜欢readLines()方法,因为它在正常(控制台)groovy中的工作方式与在Jenkins管道中的工作方式相同。
def fileContents = readFile "path/to/file"