開発者ドキュメント

Java – ファイルから読み込む


1概要

このチュートリアルでは、

Javaのファイルから読み込む

ためのさまざまな方法を探ります。

BufferedReader



Scanner



StreamTokenizer



DataInputStream



SequenceInputStream

および

FileChannel

を使用します。

次に、UTF-8でエンコードされたファイルを読み取る方法とファイルの内容から文字列を作成する方法について説明します。

最後に、Java 7でファイルから読み取るための新しい手法を探ります。

この記事はリンクの一部です:/java-tutorial[The Java – Back to Basic]シリーズ。


2

BufferedReader


で読みます


BufferedReader

を使ってファイルから読み込む簡単な方法から始めましょう。ファイル自体は次のものを含みます。

Hello world

次のコードは、

BufferedReader

を使用してファイルから読み取ります。

@Test
public void whenReadWithBufferedReader__thenCorrect()
  throws IOException {
     String expected__value = "Hello world";
     String file ="src/test/resources/test__read.txt";

     BufferedReader reader = new BufferedReader(new FileReader(file));
     String currentLine = reader.readLine();
     reader.close();

    assertEquals(expected__value, currentLine);
}

ファイルの終わりに達すると、

readLine()



null

を返します。


3

Scanner


で読む

次に、ファイルから読み取るために

Scanner

を使用しましょう – ファイルは以下を含みます:

Hello world 1

区切り文字として単純な空白を使用します。

@Test
public void whenReadWithScanner__thenCorrect()
  throws IOException {
    String file = "src/test/resources/test__read.txt";
    Scanner scanner = new Scanner(new File(file));
    scanner.useDelimiter(" ");

    assertTrue(scanner.hasNext());
    assertEquals("Hello", scanner.next());
    assertEquals("world", scanner.next());
    assertEquals(1, scanner.nextInt());

    scanner.close();
}

デフォルトの区切り文字は空白ですが、

Scanner

では複数の区切り文字を使用できます。


4

StreamTokenizer


で読む

次に、

StreamTokenizer

を使用してテキストファイルをトークンに読み込みましょう。

トークナイザの動作方法は次のとおりです。まず、次のトークンが何であるかを理解する必要があります。そのためには

tokenizer.ttype

フィールドを見ます。

次に、このタイプに基づいて実際のトークンを読みます。


  • tokenizer.nval

    – 型が数値の場合


  • tokenizer.sval

    – 型が文字列の場合

ファイルは単に含まれています:

Hello 1

次のコードは、ファイルから文字列と数値の両方を読み取ります。

@Test
public void whenReadWithStreamTokenizer__thenCorrectTokens()
  throws IOException {
    String file = "src/test/resources/test__read.txt";
   FileReader reader = new FileReader(file);
    StreamTokenizer tokenizer = new StreamTokenizer(reader);

   //token 1
    tokenizer.nextToken();
    assertEquals(StreamTokenizer.TT__WORD, tokenizer.ttype);
    assertEquals("Hello", tokenizer.sval);

   //token 2
    tokenizer.nextToken();
    assertEquals(StreamTokenizer.TT__NUMBER, tokenizer.ttype);
    assertEquals(1, tokenizer.nval, 0.0000001);

   //token 3
    tokenizer.nextToken();
    assertEquals(StreamTokenizer.TT__EOF, tokenizer.ttype);
    reader.close();
}

ファイルの終わりトークンが最後にどのように使われるかに注意してください。


5

DataInputStream


で読み取ります


DataInputStream

を使用して、ファイルからバイナリまたはプリミティブデータ型を読み取ることができます。

実際のファイルから始めましょう。

Hello

次のテストは

DataInputStream

を使用してファイルを読み込みます。

@Test
public void whenReadWithDataInputStream__thenCorrect()
  throws IOException {
    String expectedValue = "Hello";
    String file ="src/test/resources/test__read.txt";
    DataInputStream reader = new DataInputStream(new FileInputStream(file));
    String result = reader.readUTF();
    reader.close();

    assertEquals(expectedValue, result);
}


6.

FileChannel


で読みます

私たちが大きなファイルを読んでいるなら、

FileChannel

は標準的なIOよりも速いでしょう。

ファイルの内容

 Hello world

次のコードは、

FileChannel



RandomAccessFile

を使用してファイルからデータバイトを読み取ります。

@Test
public void whenReadWithFileChannel__thenCorrect()
  throws IOException {
    String expected__value = "Hello world";
    String file = "src/test/resources/test__read.txt";
    RandomAccessFile reader = new RandomAccessFile(file, "r");
    FileChannel channel = reader.getChannel();

    int bufferSize = 1024;
    if (bufferSize > channel.size()) {
        bufferSize = (int) channel.size();
    }
    ByteBuffer buff = ByteBuffer.allocate(bufferSize);
    channel.read(buff);
    buff.flip();

    assertEquals(expected__value, new String(buff.array()));
    channel.close();
    reader.close();
}


7. UTF-8エンコードファイルを読み込む

それでは、

BufferedReader

を使ってUTF-8でエンコードされたファイルを読み込む方法を見てみましょう:

@Test
public void whenReadUTFEncodedFile__thenCorrect()
  throws IOException {
    String expected__value = "青空";
    String file = "src/test/resources/test__read.txt";
    BufferedReader reader = new BufferedReader
      (new InputStreamReader(new FileInputStream(file), "UTF-8"));
    String currentLine = reader.readLine();
    reader.close();

    assertEquals(expected__value, currentLine);
}


8ファイルを文字列に読み込む


StringBuilder

をうまく利用して、ファイルの内容全体をStringに読み込むことができます。ファイルから始めましょう:

Hello world

Test line

次のコードは、ファイルから読み込んだデータを1行ずつ

StringBuilder

に追加します。

@Test
public void whenReadFileContentsIntoString__thenCorrect()
  throws IOException {
    String expected__value = "Hello world n Test line n";
    String file = "src/test/resources/test__read.txt";
    BufferedReader reader = new BufferedReader(new FileReader(file));
    StringBuilder builder = new StringBuilder();
    String currentLine = reader.readLine();
    while (currentLine != null) {
        builder.append(currentLine);
        builder.append("n");
        currentLine = reader.readLine();
    }

    reader.close();
    assertEquals(expected__value, builder.toString());
}


9 Java 7

を使用してファイルから読み取る

Java 7では、ファイルとファイルシステムを扱う新しい方法が導入されました – それを利用してファイルを読み取りましょう。

** 9.1. Java 7で小さなファイルを読む

**

ファイルの内容

 Hello world

次のコードは、新しい

Files

クラスを使用して小さなファイルを読み取る方法を示しています。

@Test
public void whenReadSmallFileJava7__thenCorrect()
  throws IOException {
    String expected__value = "Hello world";

    Path path = Paths.get("src/test/resources/test__read.txt");

    String read = Files.readAllLines(path).get(0);
    assertEquals(expected__value, read);
}

バイナリデータが必要な場合は、

readAllBytes()

メソッドを使用することもできます。

** 9.2. Java 7で大きなファイルを読む

**


Files

クラスで大きなファイルを読みたい場合は、

BufferedReader

を使用できます。

ファイルの内容

 Hello world

次のコードは、新しい

Files

クラスと

BufferedReader

を使用してファイルを読み込みます。

@Test
public void whenReadLargeFileJava7__thenCorrect()
  throws IOException {
    String expected__value = "Hello world";

    Path path = Paths.get("src/test/resources/test__read.txt");

    BufferedReader reader = Files.newBufferedReader(path);
    String line = reader.readLine();
    assertEquals(expected__value, line);
}


10結論

ご覧のとおり、プレーンJavaを使用してファイルからデータを読み取る方法はたくさんあります。

BufferedReader

を1行ずつ読み込むには

Scanner

を、異なる区切り文字を使用して読み込むには

Scanner

を、バイナリデータとプリミティブデータ型を読み込むには

DataInputStream

を、1つのストリームに複数のファイルをリンクする

SequenceInput Stream

を読み込む大きなファイルなどから

モバイルバージョンを終了