您的位置:首页 > 编程语言 > Java开发

Java——再看IO

2016-04-19 22:08 543 查看
一。编码问题

utf-8编码中,一个中文占3个字节,一个英文占1个字节;gbk编码中,一个中文占2个字节,一个英文占1个字节。

Java是双字节编码,为utf-16be编码,是说一个字符(无论中文还是英文,都占用2个字节)。因此如果这么问:Java字符串中一个字符可以放一个中文吗?是可以的!

如果一直某个字节序列的编码方式,当我们想将它还原成字符串时,应明确指定其编码格式,否则会出现乱码。

文本文件就是字节序列,可以是任意编码的字节序列。如果在中文机器上,直接创建文本文件,该文本文件只认识ANSI编码

public static void main(String[] args) throws IOException, IOException {
String file = "demo/obj.txt";
//1. 对象序列化
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(file));
StudentDemo st = new StudentDemo("aaa", "12", 15);
oos.writeObject(st);
oos.flush();
oos.close();

//2.反序列化
ObjectInputStream pis = new ObjectInputStream(
new FileInputStream(file));
try {
StudentDemo stu = (StudentDemo) pis.readObject();
System.out.println(stu);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
pis.close();
}


View Code

transient 修饰后,不会进行虚拟机默认的序列化;也可以自己完成这个元素的序列化

为什么要使用transient关键字呢?

分析ArrayList的序列化与反序列化:实质是一个数组,但是这个数组并不一定放满了,因此我们不需要讲后面没有使用的地方进行序列化,可以根据自己的需要定制序列化,只是序列化数组中的有效元素,提高性能。

序列化中子父类构造函数调用问题

一个类实现了序列化接口,其子类都可以进行序列化

对子类对象进行反序列化操作时,如果其父类没有实现序列化接口,那么其父类的构造函数会被调用;反之不会。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: