文件保存,集合框架总结

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、数据均是先进先出的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值