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