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); } } }