diff --git a/.gitignore b/.gitignore index 2b389d0..b393ade 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ *.class bin/* - +*.zip diff --git a/src/main/java/info/istlab/dp/dp1/TemplateMethodTest.java b/src/main/java/info/istlab/dp/dp1/TemplateMethodTest.java new file mode 100644 index 0000000..575f0bb --- /dev/null +++ b/src/main/java/info/istlab/dp/dp1/TemplateMethodTest.java @@ -0,0 +1,153 @@ +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 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(); + 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 byte2object(byte[] ba) { + ByteArrayInputStream bais = new ByteArrayInputStream(ba); + InputStream gzipis = null; + ObjectInputStream ois = null; + ArrayList al = null; + try { + gzipis = new GZIPInputStream(bais); + ois = new ObjectInputStream(gzipis); + + al = (ArrayList) 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 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); + } + } + +}