Newer
Older
DesignPattern / src / main / java / info / istlab / dp / dp1 / TemplateMethodTest.java
package info.istlab.dp.dp1;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class TemplateMethodTest {
    public static void main(String[] args) {
        ObjctFileStore ofs = new ObjctFileStore();
        Scanner stdin = new Scanner(System.in);
        System.out.print("Input message > ");
        ofs.add(stdin.nextLine());
        stdin.close();
    }
}

/* データを追記可能なオブジェクト(圧縮や暗号化をする可能性も) */
abstract class CompressData {
    protected ArrayList<String> mesList;

    public abstract void store2messages(); // データストアから復元 
    // データを追加する(テンプレートメソッド)
    public final void add(String mes) {
        store2messages();// ArrayListを復元
        mesList.add(mes);
        for(String s: mesList) System.out.println(s);
        messages2store();// ArrayListを圧縮(または暗号化)
    }
    public abstract void messages2store(); // データストアに保存
}

class ObjctFileStore extends CompressData {
    String filename = "ZipTest.zip";

    ObjctFileStore() {
        if (!new File(filename).exists()) { // ファイルが無い時は、空のArrayListを保存する
            mesList = new ArrayList<String>();
            messages2store();
        }
    }

    @Override
    public final void store2messages() {
        byte[] ba = ZipUtil.readBytesFromFile(filename);
        mesList = ZipUtil.byte2object(ba);
    }

    @Override
    public void messages2store() {
        byte[] ba = ZipUtil.object2byte(mesList);
        ZipUtil.writeBytesToFile(ba, filename);
    }
    // public void add(String mes){
    // }
}

class ZipUtil {
    @SuppressWarnings("unchecked")
    public static ArrayList<String> byte2object(byte[] ba) {
        ByteArrayInputStream bais = new ByteArrayInputStream(ba);
        InputStream gzipis = null;
        ObjectInputStream ois = null;
        ArrayList<String> al = null;
        try {
            gzipis = new GZIPInputStream(bais);
            ois = new ObjectInputStream(gzipis);

            al = (ArrayList<String>) ois.readObject();
            ois.close();
            gzipis.close();
            bais.close();
        } catch (IOException eofex) {
            eofex.printStackTrace(System.err);
        } catch (ClassNotFoundException excnf) {
            System.err.println("ClassNotFound Error");
        } finally {
        }
        return al;
    }

    public static byte[] object2byte(ArrayList<String> obj) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        OutputStream outstream = null;
        ObjectOutputStream oos = null;
        try {
            outstream = new GZIPOutputStream(baos);
            oos = new ObjectOutputStream(outstream);

            oos.writeObject(obj);

            oos.close();
            outstream.close();
        } catch (IOException iex) {
            iex.printStackTrace(System.out);
        }
        System.out.println("save size: " + baos.size() + " bytes.");
        return baos.toByteArray();
    }

    public static byte[] readBytesFromFile(String path) {
        File f = new File(path);
        if (!f.exists())
            System.out.println("No file " + path);

        BufferedInputStream in;
        ByteArrayOutputStream varyBuf = new ByteArrayOutputStream();
        final int LS = 1024;
        int b;
        try {
            in = new BufferedInputStream(new FileInputStream(path));
            byte buf[] = new byte[LS];
            while ((b = in.read(buf, 0, buf.length)) != -1) {
                varyBuf.write(buf, 0, b);
            }
            varyBuf.close();
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return varyBuf.toByteArray();
    }

    public static void writeBytesToFile(byte[] ba, String filepath) {
        OutputStream fos = null;
        DataOutputStream dos = null;
        try {
            fos = new FileOutputStream(filepath);
            dos = new DataOutputStream(fos);
            dos.write(ba);
            dos.close();
            fos.close();
        } catch (IOException iex) {
            iex.printStackTrace(System.out);
        }
    }

}