【问题标题】:How to read a file in Groovy into a string?如何将 Groovy 中的文件读入字符串?
【发布时间】:2011-12-05 11:17:28
【问题描述】:

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

【问题讨论】:

    标签: file 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 中工作。
      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多