![見出し画像](https://assets.st-note.com/production/uploads/images/43185968/rectangle_large_type_2_d7ad5f9ae7efc152d1b9b2f3d9af66d9.png?width=800)
【Javaお勉強日記】テキストファイルを読み込む
ローカルファイルを開いて、テキストを一行ずつ読み込む処理。
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class ReadFile {
public static void main(String[] args){
// パスオブジェクトでファイルパスを取り扱う
Path path = Paths.get("test.txt");
// リソース付きtry文+Files.newBufferedReaderで安全にファイルを開く
// Charsetオブジェクトで文字コードを指定する
try(BufferedReader in = Files.newBufferedReader(path, Charset.forName("UTF-8"))){
String line;
// ファイル内容を一行ずつ処理する
while((line = in.readLine()) != null){
System.out.println(line);
}
// 例外処理をする
}catch(IOException e){
System.out.println("ファイルが開けませんでした");
}
}
}
ファイルパスの指定にはPathオブジェクトを使う
Windowsだとパスの区切り記号が「\」だけど、Linuxだと「/」、みたいな問題に左右されずパスを取り扱える。 java.nio.file.Path をインポートして使う。
Path path = Paths.get("ファイルパス(絶対パスでも相対パスでも)")
という形式でPathオブジェクトが取れる。インスタンスを作る時に使うのはPathsクラスのget()メソッドなことに注意。(new Path じゃない)
テキストファイルを読み込むには、BufferedReaderクラス+Files.newBufferedReaderが便利
BufferdReaderクラスはnewで作るとちょっとめんどっちぃので、ラッパーであるFiles.newBufferdReader()メソッドを使うと楽。
BufferedReader in = Files.newBufferedReader(path, Charset.forName("UTF-8"))
で、ファイル内容にアクセスできるBufferdReaderオブジェクトが作れる。
java.nio.file.Filesをインポートして使おう。
文字コードの指定はCharset.forName()
文字コードを表すCharsetクラスのインスタンスで指定する。Charsetクラスのインスタンスは、
Charset.forName("文字コード名")
で作ることができるので、それをそのままnewBufferedReader()の引数に入れている。
リソース付きtry文でファイルを簡潔かつ安全に開く
pythonでファイル開くときにwith文使うのと同じ。
ファイルが上手く開けなかった時に、自動的に閉じるところまでやってくれるtry文。
try(BufferedReader in = Files.newBufferedReader(path, Charset.forName("UTF-8")))
で開いて、エラーは
catch(IOException e)
でキャッチする。ファイルの入出力に関するエラーはIOExceptionクラスで、サブクラスも色々あるので、必要に応じて分岐を作る。
っていうか、リソース付きtry文使わないとSonerLintに怒られる(´・ω・`)
とりあえず、これでざっくりファイルを開ける。
csvを列ごとに分割して読み込みたい時はScanner
CSVをカンマ区切りテキストのままぺろーんと読み込むならBufferedReaderでいけるけど、一列目はIDナンバーだからint、二列目は名前だからString...みたいに読み込みたい時はScannerを使うといい。
詳しい使い方は、必要になったらまた調べる。
この記事が気に入ったらサポートをしてみませんか?