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も参照のこと。