自制画板的保持和读取
这几天学习的是将画板中的画保存在文件中,并且可以用自制的画板读取。通过数据输入输出流用2种方法实现了这个功能,分别是通过直接保存各个形状的对象到队列和伪BMP的方式实现。
1.通过队列保存
这种方法比较直接,即将画出的每个图形,依次保存到队列中,并将此队列用流输出到文件中,由于形状对象和写入格式都是自己定义的,所以保存到文件中后也只能通过自制的画板读取图像。
储存的核心代码:
public void saveStudents(String path, QueueRealize<shape> list) {try {// /创建一个文件输出流java.io.FileOutputStream fos = new java.io.FileOutputStream(path);// 将文件输出流包装成基本类型的数据流java.io.DataOutputStream dos = new java.io.DataOutputStream(fos);// 首先保存队列的长度dos.writeInt(list.retSize());// 遍历队列for (int i = 0; i < list.retSize(); i++) {shape shp = list.getData(i);String str = shp.getName();dos.writeInt(str.getBytes().length);// 写名字长度dos.write(str.getBytes());// 将名字转成字节数组写出int len = shp.getQri().retSize();dos.writeInt(len);//写入对象的坐标个数for (int j = 0; j < shp.getQri().retSize(); j++) {int v = shp.getQri().getData(j);dos.writeInt(v);//依次写入各个对象的各个坐标}int RGB = shp.getColor().getRGB();dos.writeInt(RGB);//写入对象的颜色}// 关闭数据流dos.flush();fos.close();} catch (Exception e) {e.printStackTrace();}}
public QueueRealize<shape> readFile(String path) {// 创建一个队列用来保存读取到的对象QueueRealize<shape> list = new QueueRealize<shape>();try {// 创建文件输入流和数据输入流java.io.FileInputStream fis = new java.io.FileInputStream(path);java.io.DataInputStream dis = new java.io.DataInputStream(fis);// 读取一个Int,表示图像个数int len = dis.readInt();// 循环读取每一个图像信息for (int i = 0; i < len; i++) {int nameLen = dis.readInt();// 读名字的长度// 根据长度创建byte数组byte[] bs = new byte[nameLen];dis.read(bs);String name = new String(bs);//写入对象的坐标个数int pointNum = dis.readInt();int[] bs1 = new int[nameLen];for (int j = 0; j < pointNum; j++) {bs1[j] = dis.readInt();//依次写入各个对象的各个坐标}int cRGB = dis.readInt();java.awt.Color c = new java.awt.Color(cRGB);// 根据读取的数据类型创建一个对象if (name.equals("Line")) {Line line = new Line(bs1[0], bs1[1], bs1[2], bs1[3], c);// 将对象放入队列list.add(line);} else if (name.equals("Oval")) {Oval oval = new Oval(bs1[0], bs1[1], bs1[2], bs1[3], c);// 将对象放入队列list.add(oval);} else if (name.equals("Rect")) {Rect rect = new Rect(bs1[0], bs1[1], bs1[2], bs1[3], c);// 将对象放入队列list.add(rect);} else if (name.equals("Special")) {Special special = new Special(bs1[0], bs1[1], bs1[2],bs1[3], c);// 将对象放入队列list.add(special);} else if (name.equals("Polygon")) {Polygon polygon = new Polygon(bs1[0], bs1[1], bs1[2],bs1[3], c);for (int j = 4; j < pointNum; j++) {polygon.getQri().add(bs1[j]);}// 将对象放入队列list.add(polygon);}}} catch (Exception ef) {ef.printStackTrace();}return list;}