如何将 Groovy 中的文件读入字符串?
Posted
技术标签:
【中文标题】如何将 Groovy 中的文件读入字符串?【英文标题】:How to read a file in Groovy into a string? 【发布时间】:2011-12-05 11:17:28 【问题描述】:我需要从文件系统中读取文件并将整个内容加载到 groovy 控制器中的字符串中,最简单的方法是什么?
【问题讨论】:
【参考方案1】:String fileContents = new File('/path/to/file').text
如果您需要指定字符编码,请改用以下代码:
String fileContents = new File('/path/to/file').getText('UTF-8')
【讨论】:
这就是 Groovy 的美妙之处 :) 我是否必须执行一些 close() 语句,或者阅读器是否会被 getText() 方法关闭? @dasKeks 我认为可以安全地假设此方法的实现关闭了任何必要的资源。无论如何,您无权访问可能已创建的任何阅读器,因此您无法关闭它 我想提一下,即使File
对象来自一个普通的java jar,这也是可行的。我不确定Groovy 是否有自己的特殊File
类和text
属性,但似乎File
对象来自哪里并不重要,它是否由Groovy 代码实例化或 Java 代码。
@roens 这没有任何意义。我怀疑还有其他一些因素,比如你有一个隐藏字段的局部变量或类似的东西。【参考方案2】:
最短的路确实只是
String fileContents = new File('/path/to/file').text
但在这种情况下,您无法控制文件中的字节如何解释为字符。 AFAIK groovy 尝试通过查看文件内容来猜测此处的编码。
如果你想要一个特定的字符编码,你可以指定一个字符集名称
String fileContents = new File('/path/to/file').getText('UTF-8')
请参阅API docs on File.getText(String)
以获取更多参考。
【讨论】:
+1 用于推荐采用编码参数的版本。普通的someFile.text
不会做出明智的猜测,它只是使用平台默认编码(在现代 Linux 上通常为 UTF-8,但在 Windows/Mac OS 上类似于 windows-1252 或 MacRoman,除非你用它覆盖它-Dfile.encoding=...
)
至少在最近的 Groovy 版本中,猜测是使用 CharsetToolkit 完成的,这确实是一个智能猜测。【参考方案3】:
略有不同...
new File('/path/to/file').eachLine line ->
println line
【讨论】:
是的,但捕获“记录”仍然是一个有用的习语。 看到这一点是件好事——让逐行处理文件变得轻而易举。【参考方案4】:在我的情况下,new File()
不起作用,它在 Jenkins 管道作业中运行时会导致 FileNotFoundException
。以下代码解决了这个问题,在我看来更容易:
def fileContents = readFile "path/to/file"
我仍然不完全理解这种差异,但也许它会帮助其他遇到同样麻烦的人。可能是因为new File()
在执行 groovy 代码的系统上创建了一个文件,该文件与包含我要读取的文件的系统不同。
【讨论】:
readFile 步骤是否适合您?对我来说它有效,但它在某些单词上加上 ' ' 单引号,我不明白! 它对我来说很好用,并且没有遇到我没有自己放置的任何引号(我猜你的意思是文件内容中的引号)。也许值得为此创建一个新问题?在这种情况下,请尝试指定引号出现的情况以及准确的位置。 适用于詹金斯。因为 readFile 是一个内部关键字,不需要 jenkins-admin 的任何导入或额外批准。整个文件可以在 String var 中读取,然后通过以下代码打印:String fp_f = readFile("any_file") if (fp.length()) currentBuild.description = fp
另外,如果找不到文件,则会出现错误。
顺便说一句。这样做的原因是, new File() 在您的计算机上查找文件,因为 Jenkins 中的 readFile 在您的管道内容可能正在运行的 java vm 的 groovy 沙箱中查找......您也可以在沙盒中使用 readfile管道,但默认情况下不允许使用 File(),文件您必须在 Jenkins 设置中加入白名单才能使用它。【参考方案5】:
最简单的方法是
new File(filename).getText()
这意味着你可以这样做:
new File(filename).text
【讨论】:
【参考方案6】:您可以在这里找到其他方法来做同样的事情。
读取文件。
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();
读取文件 Line Bye Line.
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)
创建一个新文件。
new File("C:\Temp\FileName.txt").createNewFile();
【讨论】:
我不确定您在指定类型时是否需要def
。
不使用 def 代码也行,我有定义这些变量的习惯!
我喜欢 readLines() 方法,因为它在 Jenkins Pipeline 中的正常(控制台)groovy 中工作。以上是关于如何将 Groovy 中的文件读入字符串?的主要内容,如果未能解决你的问题,请参考以下文章