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


309

我需要从文件系统读取文件,然后将所有内容加载到Groovy控制器中的字符串中,最简单的方法是什么?

Answers:


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

如果需要指定字符编码,请改用以下内容:

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

6
这就是Groovy的美丽:)
Igor,

1
我是否必须执行一些close()语句,或者阅读器会被getText()方法关闭?
das Keks 2014年

6
@dasKeks我认为可以安全地假定此方法的执行会关闭任何必要的资源。无论如何,你不必访问可能产生的任何读者,所以你不能关闭它
多纳尔

我想提一下,即使File对象源自普通的Java jar,它也可以工作。我不确定Groovy是否具有自己的File带有text属性的特殊类,或者类似的东西,但是似乎File对象的来源无关紧要,无论它是由Groovy代码还是由Java代码实例化的。
ArtOfWarfare

1
@roens这没有任何意义。我怀疑混合中还有其他因素,例如您有一个隐藏字段的局部变量之类。
杰夫·斯科特·布朗

77

最短的方法确实是

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

但是在这种情况下,您无法控制文件中的字节如何解释为字符。AFAIK groovy尝试通过查看文件内容来猜测此处的编码。

如果您想要特定的字符编码,则可以使用

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

有关更多参考,请参见API文档File.getText(String)


7
+1用于推荐采用编码参数的版本。普通人someFile.text不会做出明智的猜测,它只是使用平台默认编码(通常在现代Linux上使用UTF-8,但在Windows / Mac OS上使用诸如Windows-1252或MacRoman之类的东西,除非您用覆盖了它-Dfile.encoding=...
Ian罗伯茨

至少在最新版本的Groovy中,猜测是使用CharsetToolkit进行的,它确实做出了明智的猜测。
Matthijs Bierman

53

稍有变化...

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

5
是的,但这仍然是捕获“记录”的有用习语。
史蒂夫·伯恩

看到这一点是一件好事-使逐行处理文件变得微不足道。
Bill K


12

在我的情况下new File()不起作用,它会导致FileNotFoundException在Jenkins管道作业中运行。下面的代码解决了这个问题,在我看来甚至更简单:

def fileContents = readFile "path/to/file"

我仍然不完全了解这种区别,但是也许会对其他有同样麻烦的人有所帮助。可能是由于new File()在系统上创建了一个执行常规代码的文件而导致的异常,该文件与包含我要读取的文件的系统不同。


readFile步骤适合您吗?对我来说,它有效,但是它在某些单词上用单引号引起,我听不懂!
codeGeass

它对我来说很好用,并且没有遇到我没有放置过的引号(我想您是在文件内容中指引号)。也许值得为此提出一个新的问题?在这种情况下,请尝试指定引号在什么情况下出现以及确切的位置。
P Kuijpers

2
适用于詹金斯。因为readFile是一个内部关键字,不需要jenkins-admin的任何导入或额外批准。整个文件可以用String var读取,然后通过以下代码打印:String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } 此外,如果未找到文件,则有错误。
ashish

1
顺便说一句。原因是,新的File()在计算机上查找文件,因为Jenkins中的readFile在可能正在运行管道的Java vm的常规沙箱中查找...此外,还允许您在沙箱中使用readfile管道,但默认情况下不允许使用File(),必须先在Jenkins设置中将File列入白名单,然后才能使用它。
电子人X1

2

在这里,您可以找到其他相同的方法。

读取文件。

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指定类型时,我不确定您是否需要。
维克多·M·赫拉斯梅·佩雷斯

在不使用def 代码的情况下将起作用,我习惯于定义那些变量!
shashi singh '18 -10-31
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.