-
RandomAccessFile查看全部
-
序列化中父子类的构造函数的问题:<br>
1:一个类实现了序列化接口,那么其子类都可以进行序列化<br>
2:序列化的时候,使用子类创建对象的时候会递归调用父类的构造函数——JAVA是单继承的语言,要先有父再有子
3:反序列化的时候,对子类对象进行反序列化操作时,如果其父类没有实现序列化接口,那么其父类的构造函数会被递归调用——直接父类和间接父类都是如此的,反之,如果父类实现了序列化的接口,那么子类继承它的属性和方法就可以直接反序列化,就不会调用父类的构造函数了。查看全部 -
mkdir创建一个新的文件夹就是目录
createNewFile创造了一个新的文件
查看全部 -
arraylist是自己完成序列化的不是用jvm自定义的方式<br>
因为arraylist有扩容机制 所以里面封装的那个数组可能没有放满<br>
所以为了减少开销 只序列化有信息的部分
对于对象中某个属性加上transient关键字可以是起步默认呗自动化,但仍可手动自动化。方法是重写类中的readObject方法与writeObject方法如下:
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
s.defaultWriteObject();//把jvm能序列化的元素自动序列化
s.writeInt(stuAge);//手动将transient元素序列
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
this.stuAge = s.readInt();
}
transient这种做法的作用在于比如说有一个属性是一个数组,但这个数组并没有被占满,未被占满的元素空间就不应该被序列化应该逐个逐个手动序列化,直到将所有被占据的数组空间序列化就结束
transient关键字
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
4)但可以通过writeObject和readObject自己完成序列化和反序列化arraylist是自己完成序列化的不是用jvm自定义的方式<br>
因为arraylist有扩容机制 所以里面封装的那个数组可能没有放满<br>
所以为了减少开销 只序列化有信息的部分
对于对象中某个属性加上transient关键字可以是起步默认呗自动化,但仍可手动自动化。方法是重写类中的readObject方法与writeObject方法如下:
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
s.defaultWriteObject();//把jvm能序列化的元素自动序列化
s.writeInt(stuAge);//手动将transient元素序列
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
this.stuAge = s.readInt();
}
transient这种做法的作用在于比如说有一个属性是一个数组,但这个数组并没有被占满,未被占满的元素空间就不应该被序列化应该逐个逐个手动序列化,直到将所有被占据的数组空间序列化就结束
transient关键字
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
4)但可以通过writeObject和readObject自己完成序列化和反序列化查看全部 -
对象必须实现序列化接口
ObjectOutputStream();
ObjectInputStream();
查看全部 -
BufferedReader(),字符流的过滤器
可以直接读一行,readLine();
但是不能识别换行
writer的方法有一个newLine(),写文本的时候用它直接换行
PrintWriter用起来更方便,new的时候可以直接为文件路劲,stream,wtiter,file
查看全部 -
InputStreamReader(),
转换流查看全部 -
randAccessFile操作
查看全部 -
首先,这是相对与内存的说法. 读入:将持久化的数据(存储设备,如硬盘)读取到内存中; 写出:将内存中的数据写到存储设备中(持久化)
查看全部 -
gbk中 中文占用两个字节 英文占用一个字节; 但是在utf-8中 中文占用3个字节 英文占用1个字节
java采用的是双字节编码 utf-16 其中的中文占用两个字节,英文也占用两个字节。
查看全部 -
用IO流将一个文件复制,类似将一缸水放进另一个缸里面
用FileInputStream的write()方法,一滴一滴的放
DataInputStream的WriteXxx()方法,一碗一碗 的放
BufferedOutputStream一碗一碗放入桶中,在集中放入缸中
别忘了刷新缓冲区flush();
读或写,三种方法
直接字节读取最慢
buffered次之
批量最快(自己定义缓冲区)
查看全部 -
gbk编码 中文(2byte) 英文(1byte)
utf-8编码 中文(3byte) 英文(1byte)
utf-be编码 中文(2byte) 英文(2byte)
JAVA是双字节编码,一个字符占两个byte,是utf-be编码 @@@@@@@@@@@@@@@@@@@@
当你的字节序列是某种编码时,此时把字节序列变为字符串,要用同种编码方式,否则会出现乱码。
Eclipse 默认的是gbk编码 String str1 = new String(byte1,"utf-16be"); #############################
文本文件内放的是字节序列,可以是任意编码的字节序列, 若在中文机器上编码,则只认识ansi编码
查看全部 -
利用装饰模式的原理封装的各种方法,方便使用
writeInt(),writeDouble(),writeUTF()等
DataInputStream dis = new DataInputStream(new FileInputStream(file));
包装FileInputStream的目的就是利用他的write()方法封装新的WriteInt()等
查看全部 -
read(byte[] buf)
read(byte[], int start, int size)
查看全部 -
RandomAccessFile可以对任意文件提供读写访问
RandomAccessFile ras = new RandomAccessFile(file,"rw");//rw是给ras的操作权限读或则写
读或则写时有一个pointer指针,打开文件时,指针在开头,pointer=0;
ras.seek(0);//将指针归为0位置
ras.write()和ras.read()一次只读写一个字,若是读整数,则是后八位
i=0x7fffffff为最大int数32位
ras.write(i>>>24);//整体右移24位,剩下最高八位
ras.write(i>>>16);//剩下前两个字节,只读写后八位,写下第二高八位
ras.write(i>>>8);
ras.write(i);
其实ras.writeInt();//可以直接写一个整数
文件读写完毕后一定要关闭
查看全部
举报