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、数据均是先进先出的。
分享到:
相关推荐
### Java集合框架使用总结 #### 一、概述 在Java编程中,集合框架是一个非常重要的概念,它提供了标准的方式来存储和操作数据集合。Java集合框架的设计原则是将数据结构抽象成一组接口,再通过不同的实现类来具体...
总结起来,本话题涵盖了C#对二进制数据文件的读取,图像数据的解码与显示,以及将图像数据存储到数据库中的技术。这些知识点对于开发涉及文件处理、图像操作和数据库交互的应用程序至关重要。理解并熟练掌握这些技能...
### JavaEE框架总结 #### 框架定义与学习重点 - **框架定义**:框架是一种半成品形式的代码集合,旨在提供一个基础结构供开发者在此基础上构建具体的应用程序。框架通常封装了一些通用功能,使得开发者能够重用...
在这个项目中,开发者创建了一个系统,能够将包含自定义类型的数据集合(这些类型可能包括泛型、数组、字典、字符串和日期等)保存为XML文件。这个过程通常涉及以下步骤: - **序列化**:使用`XmlSerializer`或其他...
总结起来,ASP.NET Web API提供了一套强大的工具来处理文件上传,结合MIME多部分类型,可以构建健壮的文件上传服务。理解这一过程的关键在于正确解析MIME多部分内容,以及在服务器端安全、有效地处理上传的文件。...
以下是对Struts2框架关键知识点的详细总结: 1. **默认Action**:如果没有指定Action,系统会默认使用`ActionSupport`作为基础Action。`ActionSupport`提供了基本的错误处理和验证功能。 2. **命名空间(namespace...
### Java框架面试题总结 #### Struts篇 **1. Struts的工作流程** Struts框架是一种基于MVC(Model-View-Controller)架构模式的Java Web应用框架。它的工作流程如下: - **客户端发起请求**:客户端通过浏览器或...
4. **文件存储**:在`execute`方法中,我们需要处理上传的文件,将其保存到服务器的指定位置。这通常涉及读取`ActionForm`中的`File`对象和`String`对象(代表文件名),然后将文件写入服务器磁盘。 5. **异常处理*...
- **集合框架集成**:DOM4J 结构基于 Java 集合框架,使得操作 XML 节点如操作 Java 对象一般方便。 - **DOM 支持**:除了标准的 DOM API,DOM4J 还提供了更简洁的接口来操作 DOM 树。 - **SAX 支持**:DOM4J ...
`SaveUploadedFile`方法是自定义的,它负责将上传的文件保存到服务器的指定位置。这个过程通常涉及读取文件流并写入到目标文件: ```csharp private void SaveUploadedFile(HttpPostedFileBase file, string ...
总结,EFO文件分享系统充分利用了SpringBoot的后端优势和Vue.js的前端性能,构建了一个集文件上传、下载、权限管理及远程文件操作于一体的高效文件分享平台。这样的系统对于企业和个人来说,都是一个实用且安全的...
总结来说,Delphi在没有数据库的情况下,数据保存和修改主要依赖于文件系统、注册表和内存数据结构。开发者需要根据具体需求选择合适的方法,并可能需要自定义数据管理逻辑来确保数据的完整性和一致性。学习和理解...
它通过Action类和配置文件定义了视图、控制器和模型之间的交互,提高了代码的可维护性和可测试性。 Hibernate是SSH中的ORM(对象关系映射)工具,它允许开发者以面向对象的方式来操作数据库。Hibernate通过映射Java...
总结,创建一个C# ASP.NET文件传输程序涉及多个步骤,包括前端表单设计、后端文件处理逻辑、安全性和性能优化。通过理解这些关键概念,你可以构建出高效且安全的文件传输系统,满足各种Web应用程序的需求。
服务器端需要编写代码来读取并保存这些文件,通常会涉及到文件流的处理,以及错误处理机制。 在提供的文件中,`example.html`可能是包含多文件上传表单的HTML模板,`multifile.js`和`multifile_compressed.js`则是...
在C#编程中,将不同文件打包后再形成总包下载是一项常见的需求,特别是在构建Web应用程序时,例如提供文件集合的批量下载服务。本教程将详细解释如何使用C#实现这一功能,重点是利用ZipHelper类进行文件压缩和打包。...
每个文件都是一个`HttpPostedFileBase`对象,我们可以调用其`SaveAs`方法将文件保存到服务器的指定目录。 在实际应用中,我们还需要考虑错误处理和安全问题。例如,我们需要验证文件类型和大小,防止恶意文件的上传...
在这样的表格中,你可能会看到诸如“集合框架”、“数据持久化”等章节,这些都是与保存列表相关的重要概念。 总结来说,保存一个list涉及到Java中的数据持久化,这包括选择合适的存储方式,如文件、数据库、序列化...
串行化是希望ArrayList对象保存到文件中,以便于恢复使用。实现类可串行化需要实现Serializable接口。 十二、迭代器 迭代器是允许以一致的方式对集合对象的元素进行访问的对象。迭代器对象一旦发现另一个对象在...
总结来说,"上传文件工具类"是Java应用程序中用于处理文件上传的核心组件,涉及到网络通信、文件操作、异常处理、安全控制等多个核心编程概念。理解和掌握这些知识点对于任何Java开发者来说都是至关重要的。