Javaの出力処理について書きます。
下記リンクが非常に詳しかったので、これをもとにまとめてみたんですが、咀嚼できてないっぽい・・・・ もう1~2度修正がひつようかも。
Contents
Javaのファイル入出力の基本概念
入出力の種類
Javaだけに限りませんが、プログラムの入出力操作というのは大きく分けると、
- 標準入力・出力(コマンドラインから)
- ファイル入出力
に分けられるかと思います。この2つの処理についてみていきます。
ストリーム
Javaでは行き先を持ったデータのことをストリームと呼びます。例としては、キーボード→ファイルへの保存や逆にファイル→標準出力などです。そしてJavaでは文字列の操作を行う文字ストリームと画像などのバイナリデータのバイトストリームに分かれます。
変換処理
そのため画像などのバイナリデータはデータの変換処理が必要になってきます。また文字列であっても日本語を扱う場合、文字コード変換を行わないと文字化けのリスクがあります。そのため文字コードなどの変換処理をともなうことが一般的です。
バッファとは
バッファとは緩衝材という意味ですが、Javaの場合、データの入出力元とコンピューターの間に存在する記憶領域を指します。一般的にファイルの入出力(ディスクへのアクセス)というのは時間がかかりますのでスピードや付加を考えるとできるだけ少ないことが望ましいのです。
この回数を減らすために、ディスクと入出力の間にバッファという領域を作りここである程度の領域が使用されたらディスクにアクセスすようにします。こうすることでディスクへのアクセスする回数を減らすことができます。
処理イメージ
基本的な概念がわかったところで実際の処理、コーディングの説明をしたいと思います。
実際のJavaの入出力操作では
- 入出力元からの受付
- ストリームの変換処理
- バッファの使用
と考えると流れがスムーズかと思います。(バッファは使わなくても問題ありませんが実務上はほぼ使うものと思って問題ありません。)
それぞれ下記のようなクラスを使います。
入出力元からの受付処理
標準
1 2 3 |
入力 System.in() 出力 Syste.out() |
ファイル
入力
バイナリ形式
1 2 3 |
FileInputStream(String filepath) throws FileNotFoundException FileInputStream(File fileobj) throws FileNotFoundException |
文字データ
1 2 3 |
FileReader(String filepath) throws FileNotFoundException FileReader(File fileobj) throws FileNotFoundException |
出力
バイナリ形式
1 2 3 4 5 6 7 |
FileOutputStream(String filepath) throws FileNotFoundException FileOutputStream(String filepath, boolean append) throws FileNotFoundException) apped = trueのときは追加更新(記述しなければ新規作成) FileOutputStream(File fileobj) throws FileNotFoundException |
文字データ
1 2 3 4 5 |
FileWriter(String filepath) throws FileNotFoundException FileWriter(String filepath, boolean append) throws FileNotFoundException FileWriter(File fileobj) throws FileNotFoundException |
変換処理
入力
コンストラクタ
1 2 3 |
InputStreamReader( InputStream is) InputStreamReader(InputStreamReader isr, String charSetName) |
出力
コンストラクタ
1 2 3 |
OutputStreamWriter(OutputStream os) OutputStreamWriter(OutputStream os, String charSetName) |
バッファの使用
入力
コンストラクタ
1 2 3 |
BufferedReader(Reader r) BufferedReader(Reader r, int bufSize) ※読み込みサイズの指定が可能 |
メソッド
1 2 3 |
String readLine() throws IOException 1行分の文字列をかえす。 |
出力
コンストラクタ
1 2 3 |
BufferedWriter(Writer w) BufferedWriter(Buffer w, int bufSize) ※書き込みサイズの指定が可能 |
実践的なコーディング
入力(ファイルの読み込み)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public static void main(String[] args){ try{ String filePath="C:\\Users\\Norio\\Documents\\NetBeansProjects\\Sample\\src\\sample.txt"; BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream( filePath ) , UTF_8 )); String str = br.readLine(); while( str != null ){ System.out.print(str +"\n"); str = br.readLine(); } br.close(); }catch(IOException e){ //エラーメッセージの記述 System.out.print("エラーが発生しています。"); System.exit(-1); } } |
入力(コマンドラインからの入力)※空白実行時に停止します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public static void main(String[] args){ try{ BufferedReader br = new BufferedReader(new InputStreamReader( System.in , UTF_8 )); while(true){ System.out.print("入力してください。\n"); String str = br.readLine(); if( !str.isEmpty() ){ System.out.print("入力文字 "+str +"\n"); }else{ break; } } br.close(); }catch(IOException e){ //エラーメッセージの記述 System.out.print("エラーが発生しています。"); System.exit(-1); } } |
出力(ファイルへの出力)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static void main(String[] args){ try{ String str ="test\ntest1"; String filePath="C:\\Users\\Norio\\Documents\\NetBeansProjects\\Sample\\src\\sample.txt"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream( filePath ) , UTF_8 )); bw.write(str); bw.flush(); bw.close(); }catch(IOException e){ //エラーメッセージの記述 System.out.print("エラーが発生しています。"); System.exit(-1); } } |
コマンドラインの出力は System.out.print でそのまま出力すればOKです。