Javaチュートリアル 第10章 基本I/O
「 Javaチュートリアル 第4版 (The Java Series)」を読みながら、Javaの復習をしています。
Javaチュートリアル 第4版 (The Java Series)
- 作者: シャロンザクァワ,ジャコブロイヤル,アイザックラビノビッチ,マークホーバ,トーマスリーサ,スコットホンメル,Sharon Zakhour,Isaac Rabinovitch,Thomas Risser,Jacob Royal,Scott Hommel,Mark Hoeber,安藤慶一
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2007/11
- メディア: 単行本
- 購入: 12人 クリック: 505回
- この商品を含むブログ (8件) を見る
入出力ストリーム
aoueo.txt
を用意しました。このファイルはC:\直下に配置します。
aiueo kakikukeko sasi 128 suseso tatitu 256 teto.
スキャン処理とフォーマット処理
Scannerクラスを使うことによって、"c:\aoueo.txt"のテキストファイルを読み込み、トークンに分解する事が出来ます。
import java.io.*; import java.util.Scanner; public class Main { public static void main(String[] args) throws IOException { Scanner scanner = null; try { scanner = new Scanner(new BufferedReader(new FileReader("c:\\aoueo.txt"))); // 次の要素が無くなるまでループを続ける while (scanner.hasNext()) { System.out.println(scanner.next()); } } finally { if (null != scanner) { scanner.close(); } } } }
各トークンを変換する
Scannerはcharを除く全てのプリミティブ型としてのトークンにも対応しています。
int sum = 0; // 次の要素が無くなるまでループを続ける while (scanner.hasNext()) { // 次の数字が整数値であるか? if(scanner.hasNextInt()) { sum += scanner.nextInt(); } else { // 整数値でなければ、そのまま表示する System.out.println(scanner.next()); } } // 合計を表示する System.out.println("sum: " + sum);
オブジェクトストリーム
オブジェクトストリームはオブジェクトの入出力をサポートしています。
import java.io.*; public class Main { // 入力するデータ static final int[] units = { 12, 8, 13, 29, 50 }; public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectOutputStream outputObjectStream = null; try { outputObjectStream = new ObjectOutputStream( new BufferedOutputStream( new FileOutputStream("temp"))); // オブジェクトのシリアライズ outputObjectStream.writeObject(units); } finally { outputObjectStream.close(); } int[] unitInput; ObjectInputStream inputObjectStream = null; try { inputObjectStream = new ObjectInputStream( new BufferedInputStream( new FileInputStream("temp"))); // オブジェクトのデシリアライズ unitInput = (int[])inputObjectStream.readObject(); } finally { inputObjectStream.close();; } for(int item : unitInput) { System.out.println(item); } } }
複合オブジェクトの出力と入力
オブジェクトの管理は、基本データ型をカプセル化しただけのクラスについては重要ではなく、別のオブジェクトへの参照を保持している場合、参照ツリーをたどってObjectInputStream.readObject()をした時に再構築するのに必要なオブジェクトもあわせてストリームに書き出します。
また同一ストリーム内に単一のオブジェクトへの参照を2回書き込んだ場合、読み出した後も両方が同じオブジェクトに対する参照を持ちます。
// 同じオブジェクトを2回連続で書き出す Object obj = new Object(); outputObjectStream.writeObject(obj); outputObjectStream.writeObject(obj);
各readObjectは、writeObjectとマッチさせる必要があるので2回読み込みます。
// 2回連続でオブジェクトを読み出す
Integer obj1 = inputObjectStream.readObject();
Integer obj2 = inputObjectStream.readObject();
結果的に、単一のオブジェクトへの参照である変数obj1,obj2が出来上がります。しかし、別々のストリームに書き出し読み出すと、2つの別々のオブジェクトになります。
New I/O パッケージ
高速なパフォーマンスが要求される場合、java.io.*
ではなく、java.nio.*
が使用出来るかもしれません。