1前書き

この記事では、標準のJavaクラスを使用して、クラスパス、URL、またはJARファイル内からファイルを読み取る方法について説明します。


2セットアップ

コアJavaクラスのみを使用して一連のテスト例を使用し、テストでは

Hamcrest

マッチャーを使用してアサーションを使用します。

private String readFromInputStream(InputStream inputStream)
  throws IOException {
    StringBuilder resultStringBuilder = new StringBuilder();
    try (BufferedReader br
      = new BufferedReader(new InputStreamReader(inputStream))) {
        String line;
        while ((line = br.readLine()) != null) {
            resultStringBuilder.append(line).append("\n");
        }
    }
  return resultStringBuilder.toString();
}

===

3クラスパスからファイルを読み取る

@Test
public void givenFileNameAsAbsolutePath__whenUsingClasspath__thenFileData() {
    String expectedData = "Hello World from fileTest.txt!!!";

    Class clazz = FileOperationsTest.class;
    InputStream inputStream = clazz.getResourceAsStream("/fileTest.txt");
    String data = readFromInputStream(inputStream);

    Assert.assertThat(data, containsString(expectedData));
}

ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("fileTest.txt");
String data = readFromInputStream(inputStream);

InputStream inputStream = null;
try {
    File file = new File(classLoader.getResource("fileTest.txt").getFile());
    inputStream = new FileInputStream(file);

   //...
}
finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

===

4 JDK 7

でファイルを読み取る

JDK 7では、NIOパッケージが大幅に更新されました。

Files

クラスと

readAllBytes

メソッドを使った例を見てみましょう。

readAllBytes

メソッドは

Pathを受け入れます。 Path

クラスは

java.io.File

のアップグレードと見なすことができ、いくつかの追加操作が行われています。

@Test
public void givenFilePath__whenUsingFilesReadAllBytes__thenFileData() {
   String expectedData = "Hello World from fileTest.txt!!!";

   Path path = Paths.get(getClass().getClassLoader()
     .getResource("fileTest.txt").toURI());
   byte[]fileBytes = Files.readAllBytes(path);
   String data = new String(fileBytes);

   Assert.assertEquals(expectedData, data.trim());
}

このメソッドは、ファイルの内容を__Stringに読み込むための便利な方法も提供します。

===

5 JDK 8

でファイルを読み取る

JDK 8では、

Files

クラス内に

lines()

メソッドが用意されています。 String要素の

Stream

を返します。

データをバイト単位で読み込み、UTF-8文字セットを使用してデコードする方法の例を見てみましょう。

@Test
public void givenFilePath__whenUsingFilesLines__thenFileData() {
    String expectedData = "Hello World from fileTest.txt!!!";

    Path path = Paths.get(getClass().getClassLoader()
      .getResource("fileTest.txt").toURI());

    Stream<String> lines = Files.lines(path);
    String data = lines.collect(Collectors.joining("\n"));
    lines.close();

    Assert.assertEquals(expectedData, data.trim());
}

ファイル操作のようにIOチャンネルでStreamを使うには、

close()

メソッドを使って明示的にストリームを閉じる必要があります。

ご覧のとおり、

Files

APIはファイルの内容を

String.

に読み込むための別の簡単な方法を提供します。

===

6.



FileUtils


を指定してファイルを読み取る

もう1つの一般的なオプションは、

commons

パッケージの

FileUtils

クラスを使用することです。以下の依存関係を追加する必要があります。

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

最新の依存関係バージョンを必ず確認してください。]。

ファイル読み取りコードは次のようになります。

@Test
public void givenFileName__whenUsingFileUtils__thenFileData() {
    String expectedData = "Hello World from fileTest.txt!!!";

    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource("fileTest.txt").getFile());
    String data = FileUtils.readFileToString(file, "UTF-8");

    Assert.assertEquals(expectedData, data.trim());
}

ここでは、

File

オブジェクトを

FileUtils

クラスのメソッド

readFileToString()

に渡します。このユーティリティクラスは、

InputStream

インスタンスを作成してデータを読み取るための定型的なコードを記述する必要なしに、コンテンツをロードします。

===

7.

IOUtils


でファイルを読み取る

もう1つの一般的なオプションは、

commons

パッケージの

__IOUtils


クラスを使用することです。前の

FileUtils

の例で述べたのと同じ

common-io__依存関係を追加する必要があります。

使用例を見てみましょう。

@Test
public void givenFileName__whenUsingIOUtils__thenFileData() {
    String expectedData = "This is a content of the file";

    FileInputStream fis = new FileInputStream("src/test/resources/fileToRead.txt");
    String data = IOUtils.toString(fis, "UTF-8");

    assertEquals(expectedData, data.trim());
}

ここで、

FileInputStream

オブジェクトを

IOUtils

クラスのメソッド

toString()

に渡します。このユーティリティクラスは、

InputStream

インスタンスを作成してデータを読み取るための定型的なコードを記述する必要なしに、コンテンツをロードします。

===

8 URLからコンテンツを読み取る

URLからコンテンツを読み取るには、この例では ”

/

” URLを使用します。

@Test
public void givenURLName__whenUsingURL__thenFileData() {
    String expectedData = "Baeldung";

    URL urlObject = new URL("/");
    URLConnection urlConnection = urlObject.openConnection();
    InputStream inputStream = urlConnection.getInputStream();
    String data = readFromInputStream(inputStream);

    Assert.assertThat(data, containsString(expectedData));
}


9 JARからファイルを読み込む

JARファイルの中にあるファイルを読むためには、その中にファイルがあるJARが必要です。この例では、 ”

hamcrest-library-1.3.jar

“ファイルから ”

LICENSE.txt

“を読みます。

@Test
public void givenFileName__whenUsingJarFile__thenFileData() {
    String expectedData = "BSD License";

    Class clazz = Matchers.class;
    InputStream inputStream = clazz.getResourceAsStream("/LICENSE.txt");
    String data = readFromInputStream(inputStream);

    Assert.assertThat(data, containsString(expectedData));
}

ここではHamcrestライブラリにある

LICENSE.txt

をロードしたいので、リソースの取得に役立つ

Matcher’s

クラスを使用します。同じファイルをクラスローダーを使ってロードすることもできます。