如何在Groovy中将文件读取为字符串?

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

571
String fileContents = new File('/path/to/file').text
如果您需要指定字符编码,请改用以下内容:
String fileContents = new File('/path/to/file').getText('UTF-8')

9
这就是Groovy的美妙之处 :) - Igor
1
我需要执行一些close()语句吗?还是reader会被getText()方法关闭? - das Keks
6
@dasKeks 我认为可以安全地假设该方法的实现关闭了所有必要的资源。无论如何,您没有访问可能创建的任何读取器,因此您无法将其关闭。 - Dónal
我想提一下,即使File对象来自普通的Java jar包,这也是有效的。我不确定Groovy是否有自己特殊的File类和text属性之类的东西,但似乎无论File对象来自哪里,无论是由Groovy代码还是Java代码实例化的,都没有关系。 - ArtOfWarfare
就我所知,除非我从那一行中删除“String”,否则该变量最终为空。 - roens
2
@roens 没有任何意义。我怀疑混入了其他因素,比如你可能有一个隐藏字段的本地变量之类的东西。 - Jeff Scott Brown

84

最短的路,确实如此

String fileContents = new File('/path/to/file').text

但在这种情况下,您无法控制文件中的字节如何被解释为字符。据我所知,Groovy 会尝试通过查看文件内容来猜测编码。

如果您想要一个特定的字符编码,可以使用指定字符集名称:

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

请参阅API文档中的File.getText(String)以供参考。


10
建议使用带有编码参数的版本,给这种做法点个赞。简单的 someFile.text 不能进行智能猜测,它只是使用平台默认的编码方式(通常在现代Linux上为UTF-8,但在Windows/Mac OS上可能是像windows-1252或MacRoman这样的编码方式,除非您使用了 -Dfile.encoding=... 覆盖了它)。 - Ian Roberts
在最近的Groovy版本中,至少使用CharsetToolkit进行猜测,该工具可以做出智能猜测。 - Matthijs Bierman

62

略有变化的一个例子是...

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

5
没错,这个习语仍然很有用,可以表达“为了记录”。 - Steve Byrne
看到这个真是太好了——让逐行处理文件变得微不足道。 - Bill K

36

在我的情况下,new File()无法正常工作,在Jenkins管道作业中运行时会导致FileNotFoundException异常。以下代码解决了这个问题,并且在我看来更容易实现:

def fileContents = readFile "path/to/file"

我仍然不完全理解这个区别,但也许它会帮助其他遇到同样困境的人。可能异常是由于 new File() 创建了一个文件在执行Groovy代码的系统上,而这个系统与包含我想要读取的文件的系统不同。


1
你的readFile步骤正常工作吗?对我来说它是可行的,但有些单词会用单引号''括起来,我不明白为什么! - sirineBEJI
对我来说它运行良好,并且没有遇到任何我没有放置的引号(我猜你指的是文件内容中的引号)。也许值得为此创建一个新问题?在这种情况下,请尝试说明引号出现的情况以及确切位置。 - P Kuijpers
4
适用于Jenkins。由于readFile是内部关键字,不需要从jenkins-admin导入或获得任何额外的批准。整个文件可以在一个字符串变量中读取,然后通过以下代码进行打印: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp }另外,如果文件未找到,则会出现错误。 - ashish
5
顺便说一下,之所以这样做是因为new File()会在您的计算机上查找文件,而Jenkins中的readFile会在您可能正在运行管道内容的Java VM的沙盒中查找。虽然您可以在受沙盒保护的流水线中使用readfile,但默认情况下不允许使用File(),您需要在Jenkins设置中将其加入白名单才能使用它。 - Cyborg-X1

18

5

在这里,您可以找到其他实现相同目标的方式。

读取文件。

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)

}

创建一个新文件。
new File("C:\Temp\FileName.txt").createNewFile();

1
当你指定类型时,我不确定你是否需要使用“def”。 - Victor M Perez
不使用 def 代码也可以工作,但我习惯定义那些变量! - shashi singh
我喜欢readLines()方法,因为它在普通的(控制台)Groovy和Jenkins Pipeline中都能正常工作。 - Alexander Samoylov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接