Javaによるプログラミングに関する世界観3A(入出力)です。
Javaで入出力をする時は、ストリーム系のクラスを使う。入出力はコマンドラインの基本です。頑張って理解しましょう。
キーボードによるコマンドライン入力は、InputStreamReaderにSystem.inを指定して、BufferedReaderを上から被せる。
たとえば、以下のようにする。
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line = reader.readLine();
コマンドラインからlineに一行入力する。
入力したデータは文字列型で保持されているため、数値に変換するのであればInteger.parseInt()を使う。
コンソール画面への出力はSystem.out.println()で行えばよい。
System.out.println()は改行を最後に付加する。改行を付加したくないのであればSystem.out.print()を使う。
Javaでファイル操作をする時は、バッファ系のクラスを利用する。入出力とファイル処理はコマンドラインの基本であるため、要勉強。
ファイルの読み込みはFileReaderを用いる。FileReaderでファイルから一文字だけ読み込みたい場合はread()を使う。残念ながらFileReaderを使う場合、基本的に一文字ずつしか読み込めない。
ただし、読み込みの際にBurfferedReaderという「バッファリングを処理するクラス」を一枚被せて利用することが多い。これだけで、ファイルの読み込みが高速になる。
後日注記:バッファリングとは、必要とされると思われるデータをまとめて読み込んでバッファに格納しておく機能。必要とされるデータだけをその時読み込むのではなく、ほかのデータもある程度のサイズをまとめてバッファに読み込んでおく。それによってストレージに何度もアクセスする必要がなくなり、効率的にファイルの中身を読み込むことができる。
BurfferedReaderのメソッドとしては、基本的にファイルから一行読み込むためのreadLine()と、ファイルを閉じるためのclose()を使う。
たとえば、以下のようにする。
String filename = "hoge.txt";
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
hoge.txtからreader.readLine()で一行ずつ読み込み、lineに代入して、nullが返るまでSystem.out.println()でコンソールに出力し続ける。
FileReader以外の方法として、InputStreamReaderとFileInputStreamを用いたより柔軟な方法がある。FileReaderではデフォルトの文字コードが使われるが、InputStreamReaderとFileInputStreamを用いれば自分の指定したい文字コードの種類を指定して読み込める。
後日注記:その他のファイル読み込みの方法については以下のページが参考になる。たとえばjava.nio.file.FilesのreadString()を使えば、ファイルすべてを読み込んで文字列変数に代入できる。readAllLines()ならば読み込んだ内容を文字列のリストにできる。また読み込み速度が速い方法としてFileChannelを使う方法がある。
2023.10.03-04編集
ファイルの書き込みはFileWriterを用いる。FileWriterで文字列をファイルに書き込むためにはwrite()を使う。
書き込みの際にバッファリングを行うBufferedWriterクラスを被せて利用する。ファイルの書き込みが高速になる。
また、BufferedWriterにさらにPrintWriterを被せることが多い。このPrintWriterは、ファイルに一行書き込むための便利なprintln()というメソッドを持つクラス。
たとえば、以下のようにすればよい。読み込みのためにreader、書き込みのためにwriterという二つのオブジェクトを使用している。
String filename_in = "hoge_in.txt";
String filename_out = "hoge_out.txt";
BufferedReader reader = new BufferedReader(new FileReader(filename_in));
PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(filename_out)));
String line;
while ((line = reader.readLine()) != null) {
writer.println(line);
}
reader.close();
writer.close();
reader.readLine()でhoge_in.txtから一行読み込むたびに、それをwriter.println()でhoge_out.txtに書き込み続ける。
FileWriter以外の方法として、OutputStreamWriterとFileOutputStreamを用いたより柔軟な方法がある。FileWriterではデフォルトの文字コードが使われるが、OutputStreamWriterとFileOutputStreamを用いれば自分の指定したい文字コードの種類を指定して書き込める。
2023.10.03編集
その他のファイル処理として、java.io.Fileには、
| メソッド | 説明 |
|---|---|
| delete() | ファイルを削除する |
| renameTo() | ファイルの名前を変更する |
| exists() | ファイルの存在を確認する |
| list() | ディレクトリの中のファイル一覧を取得する |
| mkdir() | ディレクトリを作成する |
| mkdirs() | 深いディレクトリを一気に作成する |
(Java言語プログラミングレッスン 第3版(下) オブジェクト指向を始めようを参考に執筆しました。)
上記では簡素化のために使っていませんが、実際はIO処理の際にエラーがでることがあるため、例外機構をきちんと使いましょう。
たとえばこんな感じ。
import java.io.*;
public class HogeReadPrinter {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
String line = reader.readLine();
System.out.println(line);
} catch (IOException e) {
System.out.println(e);
}
}
}
BufferedReader.readLine()を用いる際には、例外IOExceptionをキャッチしなければなりません。
ほかにも、FileReaderを使う時は例外FileNotFoundException、Integer.parseInt()を使う時は例外NumberFormatExceptionをキャッチする必要があります。
キャッチしなければならない例外は公式のJavaのマニュアルのthrowsの欄に書かれているので参照してください。
以下は自分で書いたコード。コマンドライン入力の応用です。
import java.io.*;
public class HogeInputCalc {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print("x = ");
String line_x = reader.readLine();
int x = Integer.parseInt(line_x);
System.out.print("y = ");
String line_y = reader.readLine();
int y = Integer.parseInt(line_y);
System.out.println(x + " + " + y + " = " + (x + y));
System.out.println(x + " - " + y + " = " + (x - y));
System.out.println(x + " * " + y + " = " + (x * y));
System.out.println(x + " / " + y + " = " + (x / y));
} catch (IOException e) {
System.out.println(e);
} catch (NumberFormatException e) {
System.out.println("入力された数値の形式が正しくありません。");
}
}
}
以上の解説とプログラムコードは以下の参考文献を部分的に参考にしました。
また、以下のページが参考になります。
Javaは文字列やバイトデータの入出力以外に、オブジェクトを入出力するシリアライズ(直列化)のクラスが用意されている。
まず、シリアライズを行う際には、シリアライズしたいオブジェクトのクラスでSerializableインターフェースを実装する。
そして、InputStreamとObjectInputStreamとreadObject()メソッドでオブジェクトを読み込む。
また、OutputStreamとObjectOutputStreamとwriteObject()メソッドでオブジェクトを書き込む。
Javaクラスライブラリ(XML)やシリアライズも参照のこと。
Linuxシステムコール・APIも参照のこと。