Properties

(1)是一个集合类, Hashtable 的子类

(2)特有功能

A:public 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 {//	创建反序列化对象 InputStream ois =	new  InputStream(	new FileInputStream( "oos.txt"	));//	还原对象  obj = ois.read ();//	释放资源ois.close();//	输出对象System.	out .println(obj);}privatestaticvoid	write()	throws	IOException {//	创建序列化流对象 OutputStream oos =	new  OutputStream(	new FileOutputStream("oos.txt"	));//	创建对象Person p =	new Person(	" 林青霞 " , 27);// public final void write (  obj) oos.write (p);//	释放资源oos.close();}

什么是序列化 ?

答:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据( OutputStream)

什么是反序列化 ?

答:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。 流数据-- 对象 ( InputStream)

随机访问流

RandomAccessFile类不属于流,是  类的子类。但它融合了 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();}

 

收藏 打印