読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Javaチュートリアル 第10章 基本I/O

Javaチュートリアル 第10章 基本I/O

Javaチュートリアル 第4版 (The Java Series)」を読みながら、Javaの復習をしています。

Javaチュートリアル 第4版 (The Java Series)

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.*が使用出来るかもしれません。