1.自定义队列实现数据写入文件,以及对该文件的读取.
由于矩形,圆形,直线包括曲线,都是以对象的形式直接存放在自定义的队列当中,而这个队列又是存在内存当中.既然这个对象组成的队列能够存储在内存里,如果能直接将这个对象队列从内存里写到文件中去,是不是也能实现保存一个由多个形状组成的图片?而当我再需要用到这个文件的时候,只需要将这个对象队列读取到内存中,而这些对象的方法,对我来说是透明的,所以我又能直接字再使用这些方法将这些对象还原成自定义画板上的形状..正是因为这个想法,我直接采用了对象类型的数据流来读写数据.
首先,我将这些形状直接以对象的方式写到文件中去.
try { // 创建文件输出流 FileOutputStream fos = new FileOutputStream(filepath .getAbsolutePath()); try { // 将文件输出流包装成对象类型的数据流 ObjectOutputStream obs = new ObjectOutputStream(fos); // 保存队列的长度. obs.writeInt(size); // 遍历队列 for (int i = 0; i < size; i++) { Shape sh = shapearray.getSh(i); obs.writeObject(sh); } obs.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); }
而当我要读取这些文件的时候,又直接以对象的形式将其从文件中读出
try { // 创建文件输出流 FileInputStream fis = new FileInputStream(filepath .getAbsolutePath()); try { // 将文件输出流包装成对象类型的数据流 ObjectInputStream obi = new ObjectInputStream(fis); int len = obi.readInt(); try { //将读取到的对象存到队列中 ShapeArray<Shape> sh = new ShapeArray<Shape>(); for (int i = 0; i < len; i++) { sh.addEmo((Shape)obi.readObject()); } return sh; } catch (ClassNotFoundException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); }
读出文件中的对象之后.就可以直接调用对象的方法来实现将其转化成画板上的形状
shapearray = array; // 将读取得到的形状对象画出来 for (int i = 0; i < shapearray.getlength(); i++) { Shape shape = shapearray.getSh(i); shape.draw(g); }
通过对数据直接以对象形式的读取完成了对自定义的画板的数据的保存.
2.以位图的方式存取
一个图片是由许许多多的点组成的,而这一个个的点就是所谓的像素点,即存储的这个图片的高度和宽度,所以,如果能够得到每个点的颜色信息,再将这些点按照它们本来所在的位置输到屏幕上,就完成这个图片的存储以及读取.
首先我们要得到每个点的颜色.可以用一个二维数组存储这些颜色信息.
try { robot = new Robot(); wide = jp.getWidth(); high = jp.getHeight(); colors = new int[wide][high]; Point p = jp.getLocationOnScreen(); Rectangle rect = new Rectangle(p.x, p.y, wide, high); BufferedImage buffimg = robot.createScreenCapture(rect); for (int i = 0; i < colors.length; i++) { for (int j = 0; j < colors[i].length; j++) { colors[i][j] = buffimg.getRGB(i, j); } }
其次,将这些颜色信息直接以基本数据类型的数据流写入文件中去.这样,便完成了一个图片各点颜色的保存,而当我们又能再这些数据再还原成图片,所以到这里完成了对这个图片的保存.
try { // 创建文件输出流 FileOutputStream fos = new FileOutputStream( filepath.getAbsolutePath()); try { // 将文件输出流包装成基本数据类型的数据流 DataOutputStream obs = new DataOutputStream(fos); // 保存图片的宽度 obs.writeInt(wide); // 保存图片的高度 obs.writeInt(high); // 遍历数组,将各点的颜色信息写入文件 for (int i = 0; i < wide; i++) { for (int j = 0; j < high; j++) { obs.writeInt(color[i][j]); } } // 强制清空,保证数据全部写入文件 obs.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); }
最后,只需要再将这些文件中的数据按照特定的方法还原成一个图片,就实现了这个文件的读取了.
try { // 创建文件输出流 FileInputStream fis = new FileInputStream( filepath.getAbsolutePath()); try { // 将文件输出流包装成基本数据类型的数据流 DataInputStream obi = new DataInputStream(fis); int wide = obi.readInt(); int high = obi.readInt(); int color[][] = new int[wide][high]; // 将读取到的各点的颜色信息存入数组 for (int i = 0; i < wide; i++) { for (int j = 0; j < high; j++) { color[i][j] = obi.readInt(); } } fis.close(); return color; } catch (IOException e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } }