リソース内のテキストファイルを文字列に読み込むのに役立つユーティリティはありますか。これが一般的な要件であると思いますが、Googlingの後に実用性が見つかりませんでした。
Guavaのような追加の依存関係なしにそれをするために古い Stupid Scannerトリック onelinerを使うことができます:
String text = new Scanner(AppropriateClass.class.getResourceAsStream("foo.txt"), "UTF-8").useDelimiter("\\A").next();
皆さん、本当に必要な場合以外は、サードパーティ製のものを使用しないでください。 JDKにはすでにたくさんの機能があります。
Java 7の場合:
new String(Files.readAllBytes(Paths.get(getClass().getResource("foo.txt").toURI())));
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;
}
yegor256Apache Commons IOを使った素敵な解決策 :
import org.Apache.commons.io.IOUtils;
String text = IOUtils.toString(this.getClass().getResourceAsStream("foo.xml"),
"UTF-8");
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
私はしばしばこの問題を私自身が抱えていました。小さなプロジェクトへの依存を避けるために、私は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で使用されるため、実際にはかなり高速です。
次のコード形式のJavaを使うことができます。
new String(Files.readAllBytes(Paths.get(getClass().getResource("example.txt").toURI())));
プロジェクトのsrc/main/resourcesにあるファイルtestcase/foo.jsonのようなプロジェクトリソースからStringを取得する場合は、次の手順を実行します。
String myString=
new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("testcase/foo.json").toURI())));
他の例ではgetClassLoader()メソッドが欠落していることに注意してください。
Apache commonsのFileUtilsを使ってください。それはメソッドを持っています readFileToString
私は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() : "";
}
}
}
サードパーティの依存関係は必要ありません。
ここに私のアプローチはうまくいった
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
}
}
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;
}
}
Guavaを含めると、次のものを使用できます。
String fileContent = Files.asCharSource(new File(filename), Charset.forName("UTF-8")).read();
(他の解決策はGuavaのための他の方法を述べましたが、それらは非推奨です)
私は readResource()メソッドはこちら と書いていますが、これは1回の呼び出しでできるようにするためです。それはGuavaライブラリに依存しますが、私は他の答えで提案されているJDKだけの方法が好きで、私はそのように変更するつもりだと思います。
戻り値を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 を参照してください。
少なくともApache commons-io 2.5以降、IOUtils.toString()メソッドはURI引数をサポートし、クラスパスのjarの内側にあるファイルの内容を返します。
IOUtils.toString(SomeClass.class.getResource(...).toURI(), ...)
静的インポートのセットを使用すると、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