web-dev-qa-db-ja.com

リソーステキストファイルを文字列に読み込むためのユーティリティ(Java)

リソース内のテキストファイルを文字列に読み込むのに役立つユーティリティはありますか。これが一般的な要件であると思いますが、Googlingの後に実用性が見つかりませんでした。

185
Loc Phan

はい、 GuavaResources クラスでこれを提供します。例えば:

URL url = Resources.getResource("foo.txt");
String text = Resources.toString(url, Charsets.UTF_8);
276
Jon Skeet

Guavaのような追加の依存関係なしにそれをするために古い Stupid Scannerトリック onelinerを使うことができます:

String text = new Scanner(AppropriateClass.class.getResourceAsStream("foo.txt"), "UTF-8").useDelimiter("\\A").next();

皆さん、本当に必要な場合以外は、サードパーティ製のものを使用しないでください。 JDKにはすでにたくさんの機能があります。

152
akosicki

Java 7の場合:

new String(Files.readAllBytes(Paths.get(getClass().getResource("foo.txt").toURI())));
79

Guava はファイルを文字列に読み込むための "toString"メソッドを持っています。

import com.google.common.base.Charsets;
import com.google.common.io.Files;

String content = Files.toString(new File("/home/x1/text.log"), Charsets.UTF_8);

この方法では、ファイルをクラスパスに含める必要はありません( Jon Skeet 前回の回答のように)。

57

純粋でシンプルなJava 8ソリューション

Java 8を使用している場合は、以下のこの簡単な方法で問題ありません。

/**
 * Reads given resource file as a string.
 *
 * @param fileName the path to the resource file
 * @return the file's contents or null if the file could not be opened
 */
public String getResourceFileAsString(String fileName) {
    InputStream is = getClass().getClassLoader().getResourceAsStream(fileName);
    if (is != null) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        return reader.lines().collect(Collectors.joining(System.lineSeparator()));
    }
    return null;
}

そしてそれはjarファイル内のリソースでも動作します。

大きくて太いライブラリは必要ありません。すでにGuavaまたはApache Commons IOを使用しているのでなければ、単にファイルを文字列として読み取ることができるようにするためにこれらのライブラリをプロジェクトに追加するのは少しやり過ぎに思えます。


静的コンテキストからのロード

これは通常効用関数であることを意図しているので、おそらくそれは静的効用クラスからアクセス可能にしたいと思うでしょう。メソッドを静的として宣言できるように、実装を少し変更しました。それは全く同じように機能します。ここにあります:

/**
 * Reads given resource file as a string.
 *
 * @param fileName the path to the resource file
 * @return the file's contents or null if the file could not be opened
 */
public static String getResourceFileAsString(String fileName) {
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    InputStream is = classLoader.getResourceAsStream(fileName);
    if (is != null) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        return reader.lines().collect(Collectors.joining(System.lineSeparator()));
    }
    return null;
}
40
Lucio Paiva

yegor256Apache Commons IOを使った素敵な解決策

import org.Apache.commons.io.IOUtils;

String text = IOUtils.toString(this.getClass().getResourceAsStream("foo.xml"),
                               "UTF-8");
38

Apache-commons-io のユーティリティ名はFileUtilsです。

URL url = Resources.getResource("myFile.txt");
File myFile = new File(url.toURI());

String content = FileUtils.readFileToString(myFile, "UTF-8");  // or any other encoding
36
Andreas_D

私はしばしばこの問題を私自身が抱えていました。小さなプロジェクトへの依存を避けるために、私はcommons ioなどを必要としないときに小さなユーティリティ関数を書くことがよくあります。ファイルの内容を文字列バッファにロードするコードは次のとおりです。

StringBuffer sb = new StringBuffer();

BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("path/to/textfile.txt"), "UTF-8"));
for (int c = br.read(); c != -1; c = br.read()) sb.append((char)c);

System.out.println(sb.toString());   

エンコーディングの指定isこの場合に重要なのは、ファイルをUTF-8で編集してからjarファイルに入れ、ファイルを開くコンピュータのファイル名がCP-1251になる可能性があるためです。ネイティブファイルのエンコーディング(たとえば)そのため、この場合はターゲットのエンコーディングがわからないため、明示的なエンコーディング情報が非常に重要です。また、ファイルcharをcharで読み込むループは非効率的に見えますが、BufferedReaderで使用されるため、実際にはかなり高速です。

16
Harry Karadimas

次のコード形式のJavaを使うことができます。

new String(Files.readAllBytes(Paths.get(getClass().getResource("example.txt").toURI())));
11
Raghu K Nair

プロジェクトのsrc/main/resourcesにあるファイルtestcase/foo.jsonのようなプロジェクトリソースからStringを取得する場合は、次の手順を実行します。

String myString= 
 new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("testcase/foo.json").toURI())));

他の例ではgetClassLoader()メソッドが欠落していることに注意してください。

4
Witbrock

Apache commonsのFileUtilsを使ってください。それはメソッドを持っています readFileToString

2
Suraj Chandran

私はclasspathからリソースファイルを読むために以下を使っています:

import Java.io.IOException;
import Java.io.InputStream;
import Java.net.URISyntaxException;
import Java.util.Scanner;

public class ResourceUtilities
{
    public static String resourceToString(String filePath) throws IOException, URISyntaxException
    {
        try (InputStream inputStream = ResourceUtilities.class.getClassLoader().getResourceAsStream(filePath))
        {
            return inputStreamToString(inputStream);
        }
    }

    private static String inputStreamToString(InputStream inputStream)
    {
        try (Scanner scanner = new Scanner(inputStream).useDelimiter("\\A"))
        {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }
}

サードパーティの依存関係は必要ありません。

2
BullyWiiPlaza

ここに私のアプローチはうまくいった

public String getFileContent(String fileName) {
    String filePath = "myFolder/" + fileName+ ".json";
    try(InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath)) {
        return IOUtils.toString(stream, "UTF-8");
    } catch (IOException e) {
        // Please print your Exception
    }
}
1
package test;

import Java.io.InputStream;
import Java.nio.charset.StandardCharsets;
import Java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try {
            String fileContent = getFileFromResources("resourcesFile.txt");
            System.out.println(fileContent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //USE THIS FUNCTION TO READ CONTENT OF A FILE, IT MUST EXIST IN "RESOURCES" FOLDER
    public static String getFileFromResources(String fileName) throws Exception {
        ClassLoader classLoader = Main.class.getClassLoader();
        InputStream stream = classLoader.getResourceAsStream(fileName);
        String text = null;
        try (Scanner scanner = new Scanner(stream, StandardCharsets.UTF_8.name())) {
            text = scanner.useDelimiter("\\A").next();
        }
        return text;
    }
}
1
sklimkovitch

Guavaを含めると、次のものを使用できます。

String fileContent = Files.asCharSource(new File(filename), Charset.forName("UTF-8")).read();

(他の解決策はGuavaのための他の方法を述べましたが、それらは非推奨です)

0
jolumg

私は readResource()メソッドはこちら と書いていますが、これは1回の呼び出しでできるようにするためです。それはGuavaライブラリに依存しますが、私は他の答えで提案されているJDKだけの方法が好きで、私はそのように変更するつもりだと思います。

0
zakmck

戻り値をList<String>行ごとにする場合、GuavaにはFiles.readLines()もあります。

List<String> lines = Files.readLines(new File("/file/path/input.txt"), Charsets.UTF_8);

テキストファイルからBufferedReaderを取得する3つの方法(FilesとGuavaのResourcesとGuavaのString)を比較するには、 here を参照してください。

0
philipjkim

少なくともApache commons-io 2.5以降、IOUtils.toString()メソッドはURI引数をサポートし、クラスパスのjarの内側にあるファイルの内容を返します。

IOUtils.toString(SomeClass.class.getResource(...).toURI(), ...)
0
user1050755

静的インポートのセットを使用すると、Guavaソリューションは非常にコンパクトなワンライナーになります。

toString(getResource("foo.txt"), UTF_8);

以下のインポートが必要です。

import static com.google.common.io.Resources.getResource
import static com.google.common.io.Resources.toString
import static Java.nio.charset.StandardCharsets.UTF_8
0
Michal Kordas