文件保存,集合框架总结 博客分类: 知识总结 文件保存集合框架
1、文件保存:不同的文件格式会将文件的信息用不同的顺序和表达写在存储器上。
1、文件由两部分组成:文件头和文件数据信息。
2、文件保存与读取步骤: 1、实例化输出流对象并得到队列长度
2、写入要保存文件的各种属性
3、实例化输入流对象并读出文件长度
4、读出文件各种属性
5、在保存和打开按钮上添加监听
6、得到保存和打开路径,并在打开文件时调用绘图的方法
注意:写入和读取的格式要对应!
以画图板的保存为例:
1、 首先定义保存图形和打开图像的方法。
package cn.wjw.study0727; import java.awt.Color; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class SaveOpen { /** * 保存图形的方法 * @param path路径 * @param dl队列 * @return 返回保存是否成功。 */ public boolean SaveFile(String path,ListImpl li){ boolean state = false; try{ //实例化输出流对象 OutputStream os = new FileOutputStream(path); DataOutputStream dos = new DataOutputStream(os); //写入队列的长度 dos.writeInt(li.size()); //循环 for(int i=0;i<li.size();i++){ Graph graph= (Graph)li.get(i); //获取图形 byte item = graph.getItem(); //写入图形长度 //dos.writeInt(item.length()); dos.writeByte(item); //写入坐标和宽高 int x1 = graph.getX1(); int y1 = graph.getY1(); int x2 = graph.getX2(); int y2 = graph.getY2(); dos.writeInt(x1); dos.writeInt(y1); dos.writeInt(x2); dos.writeInt(y2); //写入颜色 int r = graph.getColor().getRed(); int g0 = graph.getColor().getGreen(); int b = graph.getColor().getBlue(); dos.writeInt(r); dos.writeInt(g0); dos.writeInt(b); } dos.close(); os.close(); state = true; }catch(IOException e){ e.printStackTrace(); } return state; } /** * 打开图形方法 * @param path:路径 * @return:返回打开是否成功 */ public boolean OpenFile(String path){ boolean state = false; try{ //实例化输入流对象 InputStream is = new FileInputStream(path); DataInputStream dis = new DataInputStream(is); //读取图形总数 int size = dis.readInt(); //循环 for(int i=0;i<size;i++){ //读取图形长度 //int len = dis.readChar(); //String str = " "; //for(int j=0;j<len;j++){ //str += dis.readChar(); //} byte item = (byte) dis.readByte(); //读取坐标和宽高 int x1 = dis.readInt(); int y1 = dis.readInt(); int x2 = dis.readInt(); int y2 = dis.readInt(); //读取颜色 int r = dis.readInt(); int g0 = dis.readInt(); int b = dis.readInt(); Color color = new Color(r,g0,b); Graph graph = new Graph(item,color,x1,y1,x2,y2); DrawListener.li.add(graph); } dis.close(); is.close(); state = true; }catch(IOException e){ e.printStackTrace(); } return state; } }
2、给按钮加上监听,得到保存和打开的路径,并在打开时重新绘制图像。
//使用匿名内部类方法来实现按钮的动作事件处理类 ActionListener al = new ActionListener(){ //动作事件的处理 public void actionPerformed(ActionEvent e){ //判断当前点击的按钮是否是Color if(e.getActionCommand().equals("Color")){ color = JColorChooser.showDialog(null,"选择颜色",Color.RED); System.out.println("Color:"+color); }else if(e.getActionCommand().equals("Save")){ SaveOpen so = new SaveOpen(); //得到保存路径 boolean state = so.SaveFile("D:/jw1/wjw/src/cn/wjw/study0727/draw", DrawListener.li); System.out.println("保存成功!"+state); }else if(e.getActionCommand().equals("Open")){ SaveOpen so = new SaveOpen(); //得到打开路径 boolean state = so.OpenFile("D:/jw1/wjw/src/cn/wjw/study0727/draw"); System.out.println("打开文件!"+state); up(); }else if(e.getActionCommand().equals("Line")){ item = 0; System.out.println("你点击的按钮是Line"); }else if(e.getActionCommand().equals("Rect")){ item = 1; System.out.println("你点击的按钮是Rect"); }else if(e.getActionCommand().equals("Oval")){ item = 2; System.out.println("你点击的按钮是Oval"); } } }; //将动作事件处理类对象绑定到按钮的动作监听器方法上 btnLine.addActionListener(al); btnRect.addActionListener(al); btnOval.addActionListener(al); btnColor.addActionListener(al); btnSave.addActionListener(al); btnOpen.addActionListener(al); this.setVisible(true); //获取窗体上的画布对象 Graphics g = this.getGraphics(); //实例化一个DrawListener类的对象 DrawListener dl = new DrawListener(g,this); //给事件源添加鼠标监听器方法,绑定事件处理类对象 this.addMouseListener(dl); } //重写和重绘 public void paint(Graphics g){ //执行父类的重绘方法 super.paint(g); //获取队列,并循环 for(int i = 0;i < DrawListener.li.size();i++){ Graph graph = DrawListener.li.get(i); //设置颜色 g.setColor(graph.getColor()); //判断是否是直线,若是则画直线 if(graph.getItem() == 0){ g.drawLine(graph.getX1(), graph.getY1(), graph.getX2(), graph.getY2()); } //判断是否是矩形,若是则画矩形 else if(graph.getItem() == 1){ g.drawRect(graph.getX1(), graph.getY1(), graph.getX2(), graph.getY2()); } //判断是否是圆,若是则画圆 else if(graph.getItem() == 2){ g.drawOval(graph.getX1(), graph.getY1(), graph.getX2(), graph.getY2()); } } } //调用重绘的方法 public void up(){ this.repaint(); }
2、集合框架:在java.util.*包下。
1、类型:1、Set:就是简单的把对象加入到集合中,就像往袋子里放东西。
但是Set集合中不能有重复的对象。常用子类有java.util.HashSet,java.util.TreeSet
例:public java.util.Set<Moive> getSet(){
java.util.Set<Moive> set = new java.util.HashSet<Moive>();
for(int i=0;i<5;i++){
Moive m = new Moive("电影"+(char)(i+65),i+120);
set.add(m);
}
}
2、List:像队列一样有序的把对象加入到集合中,就像小朋友排队过马路。
常用实现类:java.util.Vector,java.util.ArrayList
例:public List<Moive> getList(){
List list = new ArrayList();
for(int i=0;i<5;i++){
Moive m = new Moive("电影"+(char)(i+65),i+120);
list.add(m);
}
}
3、Map:用来存放存在一一对应关系的对象,和collection是同一级别的,就像指纹与人之间是一一对应的
常用实现类:java.util.HashMap,java.util.Hashtable。
Set和List都是继承了Collection接口的子接口。
Map中存放的是两个对象,一个为key(键),一个为value(值),Map中的键不能重复,值可以重复,即一个值可对应几个键,而一个键只能对应一个值。
例:public Map<String,Moive> createTable(){
Map<String, Moive> map = new java.util.HashMap<String, Moive>();
for(int i=0;i<5;i++){
Moive m = new Moive("电影"+(char)(i+65),i+120);
map.put(""+i,m);
}
return map;
}
2、Set与List的区别:1、Set是无序的,而List是有序的。
2、Set不能有重复的数据,但是List可以有重复的数据。
3、Set不能通过索引获得对象,要获取对象,必须要借助于迭代器。
3、List与自定义队列的相同与区别:1、都是有序的。
2、操作类似,都是通过数组实现的。
3、数据均是先进先出的。