ArrayListにファイルを読み込む
1. 概要
このチュートリアルでは、different ways of reading a file into an ArrayListについて説明します。
read a file in Javaには多くの方法があります。 ファイルを読み取ると、そのファイルのコンテンツに対して多くの操作を実行できます。
並べ替えなど、これらの操作の一部では、ファイルのコンテンツ全体をメモリに処理する必要があります。 このような操作を実行するには、ファイルを行または単語のArrayまたはListとして読み取る必要がある場合があります。
2. FileReaderの使用
Javaでファイルを読み取る最も基本的な方法は、FileReaderを使用することです。 定義上、FileReader is a convenience class for reading stream of characters from a File.
FileReader:を初期化するために使用できるコンストラクターは複数あります
FileReader f = new FileReader(String filepath);
FileReader f = new FileReader(File f);
FileReader f = new FileReader(FileDescriptor fd);
これらのコンストラクタはすべて、デフォルトの文字エンコーディングとデフォルトのバイトバッファサイズが適切であると想定しています。
ただし、カスタム文字エンコードとバイトバッファサイズを提供する場合は、InputStreamReaderまたはFileInputStreamを使用できます。
次のコードでは、FileReader:を使用してファイルからArrayList,に行を読み込む方法を示します。
ArrayList result = new ArrayList<>();
try (FileReader f = new FileReader(filename)) {
StringBuffer sb = new StringBuffer();
while (f.ready()) {
char c = (char) f.read();
if (c == '\n') {
result.add(sb.toString());
sb = new StringBuffer();
} else {
sb.append(c);
}
}
if (sb.length() > 0) {
result.add(sb.toString());
}
}
return result;
3. BufferedReaderの使用
FileReaderは非常に使いやすいですが、ファイルを読み取るときは常にBuffereReaderでラップすることをお勧めします。
これは、BufferedReader uses a char buffer to simultaneously read multiple values from a character-input stream andが、基になるFileStreamによって行われるread()呼び出しの数を減らすためです。
BufferedReaderのコンストラクターは、Readerを入力として受け取ります。 さらに、コンストラクタでバッファサイズを指定することもできますが、ほとんどのユースケースでは、デフォルトのサイズは十分に大きくなります。
BufferedReader br = new BufferedReader(new FileReader(filename));
BufferedReader br = new BufferedReader(new FileReader(filename), size);
Readerクラスから継承されたメソッドに加えて、BufferedReader also はreadLine()メソッドを提供し、行全体をString:として読み取ります。
ArrayList result = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
while (br.ready()) {
result.add(br.readLine());
}
}
4. Scannerの使用
ファイルを読み取るもう1つの一般的な方法は、Scannerを使用することです。
Scannerは、正規表現を使用してプリミティブ型と文字列を解析するために使用される単純なテキストスキャナーです。
ファイルを読み取るとき、ScannerはFileまたはFileReaderオブジェクトを使用して初期化されます。
Scanner s = new Scanner(new File(filename));
Scanner s = new Scanner(new FileReader(filename));
BufferedReader, Scannerと同様に、行全体を読み取るreadLine()メソッドを提供します.さらに、, itは、読み取りに使用できる値が多いかどうかを示すhasNext()メソッドも提供します:
ArrayList result = new ArrayList<>();
try (Scanner s = new Scanner(new FileReader(filename))) {
while (s.hasNext()) {
result.add(s.nextLine());
}
return result;
}
Scannerは、区切り文字を使用して入力をトークンに分割します。デフォルトの区切り文字は空白です。 これらのトークンは、使用可能なさまざまなnext (nextInt、nextLongなど)メソッドを使用して、さまざまなタイプの値に変換できます。
ArrayList result = new ArrayList<>();
try (Scanner s = new Scanner(new FileReader(filename))) {
while (s.hasNext()) {
result.add(s.nextInt());
}
return result;
}
5. Files.readAllLinesの使用
おそらく、ファイルを読み取り、そのすべての行をArrayListに解析する最も簡単な方法は、readAllLines() method available in Files class:を使用することです。
List result = Files.readAllLines(Paths.get(filename));
このメソッドは、特定の文字エンコーディングに従って読み取るために、charsetパラメータを取ることもできます。
Charset charset = Charset.forName("ISO-8859-1");
List result = Files.readAllLines(Paths.get(filename), charset);
6. 結論
要約すると、Fileの内容をArrayListに読み取る一般的な方法について説明しました。 また、さまざまな方法の長所と短所についても説明しました。
たとえば、BufferedReaderを使用して、効率を上げるために文字をバッファリングできます。 または、Scannerを使用して、区切り文字を使用してプリミティブを読み取ることもできます。 または、基礎となる実装について心配することなく、単にFiles.readAllLines(),を使用することもできます。
いつものように、コードはGitHub repositoryで利用できます。