22-功能流、图形化界面
- 格式:docx
- 大小:547.32 KB
- 文档页数:24
功能流、图形化界面 1. 功能流 1.1. 功能流介绍 前面学习的都是最基本的IO流对象,字节流和字符流。它们的操作规律基本是一致。 读取数据使用read方法,写数据write方法。
功能流:在IO流体系中,还有其他的流对象,这些流对象都是基于字节或者字符流而存在一些IO流,它们在字节或者字符流的基础上增强了特定的功能。当在开发中如果需要这些特定的功能,才能使用这些功能流,如果不需要这些特定功能,但还需要读写数据,那么我们依然使用前面学习的字节或者字符流操作。
学习功能流:记住每个功能流是完成什么功能即可。
1.2. Properties介绍
Properties:它本身属于Map集合体系中一员。但是它有可以和IO流结合使用。 Propertis类本身中存放的key和value这样具有一定对应关系的数据,当和IO流结合在一起的时候,可以直接将集合中的数据存储在指定的文件中,或者从文件加载数据,当数据加载完成之后,数据就已经被存放在集合中。
Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。属性列表中每个键及其
对应值都是一个字符串。 1.2.1. Properties写数据 /* * 演示将Properties集合中的数据使用IO流写到文件中 * store(OutputStream out, String comments) */ publicstaticvoid write() throws IOException {
//创建Properties集合对象 Properties prop = new Properties(); //给集合中保存数据 prop.put("zhangsan", "beijing"); prop.put("lisi", "shanghai"); prop.put("wangwu", "wuhan"); prop.put("zhaoliu", "guangzhou"); //将集合中的数据保存到文件中 prop.store(new FileOutputStream("d:/prop.properties"), "buzhidaoxiesha"); }
使用Properties和IO流结合将集合中的数据保存到文件中:
在实际开发中,我们将有对应关系的数据通过io流保存到文件中之后,在文件中得到了key=value这样的数据。这类文件在开发中被称为配置文件。
配置文件:这个文件主要存在的价值是配置软件启动或者运行过程中需要的一些参数信息的。 key=value。在程序中我们可以通过这key得到对应的value值,进而就可以通过这个value决定软件应该如何运行以及程序应该怎么去处理接下来的问题。
例如:QQ软件: 第一次登陆QQ之后,如果选择了记住密码,下次再登陆QQ的时候,就直接显示账号和密码。而不用填写。 肯定在第一次运行QQ的过程中,将账号和密码保存到文件中。 QQ=123456 pwd=abc123 在配置文件中的以#开始的数据,称为配置文件中的注释数据,它不属于配置文件中的有效数据。
在使用Properties类和IO结合将map中的数据保存到文件中,如果map中有中文,所有的中文都会被编码。
编码的过程使用的不是本地默认的GBK编码表,而是使用的JDK中自带的unicode编码表对中文件进行的编码:在JDK中有一个命令专门负责中文字符的编码:
1.2.2. Properties读取数据 /* * 演示Properties读取文件中的数据 */ publicstaticvoid read() throws IOException {
//创建Properties对象,用于存放IO流读取到的数据 Properties prop = new Properties();
/* * 加载数据 * 当Properties中的load方法执行完成之后, * 数据就已经被加载到Properties集合中 */ prop.load(new FileInputStream("d:/prop.properties"));
//正常操作集合 Setset = prop.keySet(); for (Iterator it = set.iterator(); it.hasNext();) { Object key = it.next(); Object value = prop.get(key); System.out.println(key+"...."+value); } }
1.3. SequenceInputStream介绍
SequenceInputStream表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,
直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
SequenceInputStream它属于字节输入流。它的主要功能是将多个输入流合并成一个输入流。输入流按照先后次序进行逻辑串联。
需求:需要将三个文件中的数据合并到第四个文件中。 /* * 演示SequenceInputStream 将多个输入流合并成一个输入流 */ publicclass SequenceInputStreamDemo { publicstaticvoid main(String[] args) throws IOException {
//创建List集合 Listlist = new ArrayList();
for(inti = 1 ; i<= 3 ; i++ ){ FileInputStream fis = new FileInputStream("d:/"+i+".txt"); //将流添加到list集合中 list.add(fis); }
//使用Collections工具类,获取到Enumeration对象 Enumerationen = Collections.enumeration(list);
//创建序列输入流 SequenceInputStream sis = new SequenceInputStream(en); //创建输出流 FileOutputStream fos = new FileOutputStream("d:/4.txt");
//模版代码读写数据 byte[] buf = newbyte[1024]; intlen = 0 ; while( ( len = sis.read(buf) ) != -1 ){ fos.write(buf, 0, len); }
//关流 sis.close(); fos.close(); } }
1.4. 序列化和反序列化流 序列化和反序列化:这两个流对象可以将Java中new出来的对象直接保存到文件中。或者将保存在文件中的对象读取到程序中。 例如:Person P= new Person(“张三”,“男”,23); 序列化:将对象保存到文件中 反序列化:将文件中的对象读取到程序中。 1.4.1. 序列化 ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。
ObjectOutputStream:它可以将Java中创建出的对象(在堆内存中),直接写到文件中。
ObjectOutputStream:它可以将堆中的对象中的所有数据进行编码,转成二进制数据,但是它不能将这些二进制数据写到文件中,因此创建对象的时候,需要给其传递一个可以和底层文件交互的流对象。
/* * 序列化流对象ObjectOutputStream * */ publicclass ObjectOutputStreamDemo { publicstaticvoid main(String[] args) throws IOException {
//创建需要被序列化的流对象 Person p = new Person("张三",23); //创建用于将对象持久保存的序列化流对象 ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("d:/obj.obj"));
//调用写的方法 oos.writeObject(p);
//关流 oos.close(); } }
上述的程序需要将Person对象持久的保存到文件中。但是运行的时候发生了异常。
在Java中当需要将一个对象持久的保存(文件、网络),Java中规定这个对象所属的类必须实现序列化接口,只要对象没有实现序列化接口在运行的时候都会发生没有实现序列化异常java.io.NotSerializableException。
异常的解决方案:让Person类实现序列化接口。
Java中定义了Serializable接口,它规定只有实现了这个接口的类的对象才能使用ObjectOutputStream实现对象的持久保存。
在Java中有部分接口中并没有任何的方法需要实现,这些接口的存在的意义仅仅是为了进行某些特定功能的限定或者是为了声明某些需要JVM检测的功能。这类接口被称为标记型接口。