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
を読み込む大きなファイルなどから