Groovyのファイルを文字列に読み込む方法は?


309

ファイルシステムからファイルを読み取り、コンテンツ全体をGroovyコントローラーの文字列に読み込む必要があります。これを行う最も簡単な方法は何ですか?

回答:


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 14

6
@dasKeksこのメソッドの実装が必要なリソースを閉じると想定しても安全だと思います。とにかく、あなたは、作成することができる任意の読者へのアクセス権を持っていないので、あなたはできませんそれに近い
ドナル・

これは、Fileオブジェクトが通常のJava jarから発生した場合でも機能することを述べておきたいと思います。Groovyに属性などの独自の特別なFileクラスがあるかどうかはtextわかりませんでしたが、FileGroovyコードまたはJavaコードのどちらでインスタンス化されていても、オブジェクトがどこから来たかは問題ではないようです。
ArtOfWarfare 2017年

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
確かに、しかしそれは「記録のために」キャプチャするための有用な慣用句です。
Steve Byrne

これを見るのは良いことです。ファイルを1行ずつ処理するのは簡単です。
Bill K


12

私の場合new File()は機能しませんFileNotFoundException。Jenkinsパイプラインジョブでwhenを実行すると発生します。次のコードはこれを解決し、私の意見ではさらに簡単です:

def fileContents = readFile "path/to/file"

私はまだこの違いを完全に理解していませんが、同じ問題を抱えている他の人を助けるかもしれません。おそらく、例外が発生したのnew File()は、グルーヴィーなコードを実行するシステム上にファイルを作成したためです。これは、読み取りたいファイルが含まれているシステムとは別のシステムでした。


readFileステップは正常に機能しますか?私にとってそれは機能しますが、いくつかの単語に ''一重引用符を作成します、理解できません!
codeGeass 2018年

それは私にとってはうまく機能し、私が自分で配置しなかった引用に遭遇しませんでした(ファイルの内容の引用を意味していると思います)。これについて新しい質問を作成する価値はあるでしょうか?その場合は、引用符が表示される場所と正確な場所を指定してください。
P Kuijpers

2
ジェンキンスで動作します。readFileは内部キーワードであり、jenkins-adminからのインポートや追加の承認は必要ありません。ファイル全体をString varで読み取ってから、以下のコードを使用して印刷できます。String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } また、ファイルが見つからない場合、エラーが発生します。
アシシュ

1
ところで この理由は、JenkinsのreadFileが、パイプラインスタッフが実行されている可能性があるJava vmのグルービーなサンドボックスを検索するのと同じように、new File()がコンピューター上のファイルを検索することです。パイプラインがFile()の使用はデフォルトでは許可されていません。Fileを使用するには、Jenkins設定でホワイトリストに登録する必要があります。
Cyborg-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タイプを指定するときに必要かどうかはわかりません。
Victor M Herasme Perez 2018

def コードを使用しなくても機能するので、これらの変数を定義する習慣があります。
shashi sing 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.