Java 学习(26)---(IO流之Properties 类 / 合并流 / 序列化流 / 随机访问流)
Properties
(1)是一个集合类, Hashtable 的子类
(2)特有功能
A:public Object setProperty(String key,String value) ; // 添加元素
B:public String getProperty(String key) ; // 根据键获取元素
C:public Set<String> stringPropertyNames() ; // 获取所有的键的集合
(3)和 IO 流结合的方法
把键值对形式的文本文件内容加载到集合中
public void load(Reader reader)
public void load(InputStream inStream)
把集合中的数据存储到文本文件中
public void store(Writer writer,String comments) public void store(OutputStream out,String comments)
(4)案例:
A:根据给定的文件判断是否有键为 "lisi" 的,如果有就修改其值为 100
// 把文件中的数据加载到集合中 Properties prop = new Properties(); Reader r = new FileReader( "user.txt" ); prop.load(r); r.close(); // 遍历集合,获取得到每一个键 Set<String> set = prop.stringPropertyNames(); for (String key : set) { //判断键是否有为 "lisi" 的,如果有就修改其值为 "100" if ( "lisi" .equals(key)) { prop .setProperty( key ,"100"); break ; } } // 把集合中的数据重新存储到文件中 Writer w = new FileWriter( "user.txt"); prop.store(w,null); w.close();
合并流 (理解即可 )
(1)把多个输入流的数据写到一个输出流中。
(2)构造方法:
A:SequenceInputStream(InputStream s1, InputStream s2)
B:SequenceInputStream(Enumeration<? extends InputStream> e)
// 需求:把下面的三个文件的内容复制到 Copy.java 中
// ByteArrayStreamDemo.java,CopyFileDemo.java,DataStreamDemo.java // SequenceInputStream(Enumeration e) // 通过简单的回顾我们知道了 Enumeration 是Vector 中的一个方法的返回值类型。 // Enumeration<E> elements() Vector<InputStream> v = new Vector<InputStream>(); InputStream s1 = new FileInputStream( "ByteArrayStreamDemo.java" InputStream s2 = new FileInputStream( "CopyFileDemo.java" ); InputStream s3 = new FileInputStream( "DataStreamDemo.java" ); v.add(s1); v.add(s2); v.add(s3); Enumeration<InputStream>en =v .elements(); SequenceInputStream sis =new SequenceInputStream(en ); // 或 SequenceInputStream sis = new SequenceInputStream(s1,s2,s3); BufferedOutputStream bos =new BufferedOutputStream( new FileOutputStream("Copy.java")); // 如何写读写呢,其实很简单,你就按照以前怎么读写,现在还是怎么读写 byte [] bys = newbyte [1024]; int len = 0; while ((len = sis.read(bys)) != -1) { bos .write( bys , 0, len ); } bos.close(); sis.close();
序列化流 (理解)
(1)可以把对象写入文本文件或者在网络中传输
(2)如何实现序列化呢 ?
让被序列化的对象所属类实现序列化接口。
java.io.Serializable:该接口是一个标记接口。没有功能需要实现。
NotSerializableException: 未序列化异常
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
该接口居然没有任何方法,类似于这种没有方法的接口被称为标记接口。
java.io.InvalidClassException:
cn.itcast_07.Person; local class incompatible:
stream classdesc serialVersionUID = -2071565876962058344,
local class serialVersionUID = -8345153069362641443
为什么会有问题呢 ?
Person 类实现了序列化接口,那么它本身也应该有一个标记值。
这个标记值假设是 100。开始的时候:
- Person.class -- id=100
- wirte 数据: oos.txt -- id=100
- read 数据 : oos.txt -- id=100
- 现在:
- Person.class -- id=200
- wirte 数据: oos.txt -- id=100
- read 数据 : oos.txt -- id=100
(3)注意问题:
把数据写到文件后,在去修改类会产生一个问题。如何解决该问题呢 ?
在类文件中,给出一个固定的序列化 id 值。而且,这样也可以解决黄色警告线问题
private staticvoid read() throws IOException, ClassNotFoundException { // 创建反序列化对象 ObjectInputStream ois = new ObjectInputStream( new FileInputStream( "oos.txt" )); // 还原对象 Object obj = ois.readObject(); // 释放资源 ois.close(); // 输出对象 System. out .println(obj); } privatestaticvoid write() throws IOException { // 创建序列化流对象 ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream( "oos.txt" )); // 创建对象 Person p = new Person( " 林青霞 " , 27); // public final void writeObject(Object obj) oos.writeObject(p); // 释放资源 oos.close(); }
什么是序列化 ?
答:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream)
什么是反序列化 ?
答:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。 流数据-- 对象 (ObjectInputStream)
随机访问流
RandomAccessFile类不属于流,是 Object 类的子类。但它融合了 InputStream 和 OutputStream 的功能。支持对文件的随机访问读取和写入。
public RandomAccessFile(String name,String mode) : 第一个参数是文件路径,第二个参数是操作文件的模式。
模式有四种,我们最常用的一种叫 "rw", 这种方式表示我既可以写数据,也可以读取数据
private staticvoid read() throws IOException { // 创建随机访问流对象 RandomAccessFile raf = newRandomAccessFile("raf.txt" ,"rw"); int i = raf.readInt(); System. out .println(i); // 该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。 System. out .println(" 当前文件的指针位置是: " + raf.getFilePointer()); char ch = raf.readChar(); System. out .println(ch); System. out .println(" 当前文件的指针位置是:" + raf.getFilePointer()); String s = raf.readUTF(); System. out .println(s); System. out .println( " 当前文件的指针位置是: " + raf.getFilePointer()); // 我不想重头开始了,我就要读取 a,怎么办呢 ? raf.seek(4); ch = raf.readChar(); System. out .println(ch); } privatestaticvoid write() throws IOException { // 创建随机访问流对象 RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw" ); // 怎么玩呢 ? raf.writeInt(100); raf.writeChar('a'); raf.writeUTF("中国"); raf.close(); }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java 学习(25)---(IO流之数据流 / 内存操作流 / 打印流 / 标准输入输出流)
数据流 可以读写基本数据类型的数据 数据输入流: DataInputStream DataInputStream(InputStream in) 数据输出流: DataOutputStream DataOutputStream(OutputStream out) privatestaticvoid read() throws IOException { // DataInputStream(InputStream in) // 创建数据输入流对象 DataInputStream dis = newDataInputStream( new FileInputStream("dos.txt")); // 读数据 byte b = dis.readByte(); short s = dis.readShort(); int i = dis.readInt(); long l = dis.readLong(); float f = dis.readFloat(); double d = dis.readDouble(); char c = dis.readChar(); boolean bb ...
- 下一篇
OneinStack如何支持fileinfo?
由于php打开fileinfo(php参数–enable-fileinfo)需要大量系统资源才能编译通过,考虑到小内存机器,因此默认OneinStack fileinfo不支持,需额外再安装2016-06-19之后安装oneinstack 执行./addons.sh 选择4 安装fileinfo即可 2016-06-19之前安装oneinstack,请如下手工编译安装 如果需要支持fileinfo,如下:开始编译 cd /root/oneinstack/src tar zxvf php-5.6.20.tar.gz # 解压已经安装的php版本 cd php-5.6.20/ext/fileinfo /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install cd /usr/local/php/lib/php/extensions ls #看到no-debug-non-zts-20131226类似文件夹 cd no-deb...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7