Java数据流操作基础

发布日期:2018-03-16    浏览次数:512

 

IO流:

操作的数据是否是纯文本数据?

是:Reader,Writer

不是:InputStream,OutputStream

 

为啥字节流用int接收而不用Byte?

-1代表返回条件(即补码形式的11111111)用字节流很有可能读到它。

把它假设成一个检测门,用int就是在数据前加上24个0,伪装通过检测门,在输出的时候又会默认去掉24个0。

 

为啥不用字节流操作字符,还要用字符流呢? 

因为在不同的编码表中,中文占的字节数不一样。

 

注意事项:

1.字节流写入字符要用getBytes();

2.Writer自带2k缓冲区,如果不关流将会将内容写到缓冲区里。

 

缓冲流 (采用了装饰设计模式):

特有的方法:

  1.readLine() 读一行,返回时不带换行符。

  2.newLine() 写入一个换行符。

补充:newLine和\r\n的区别在于newLine是跨平台的,而\r\n只是在window上适用。

 

Java.util.Properties:一个可以将键值进行持久化存储的对象(Hashtable的子类)

 

IO流核心代码,拷贝

public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("E:\\read.txt");
FileOutputStream fos = new FileOutputStream("E:\\write.txt");
//int len;
//byte[]arr=new byte[1024];
int b;
//while((len=fis.read(arr))!=-1) {
//fos.write(arr,0,len);
while((b=fis.read())!=-1) {
fos.write(b);
}
fis.close();
fos.close();
System.out.println("文件拷贝代码");
}

 

File类(略):

序列化:

就是把内存中的java对象转换成平台无关的二进制流,从而允许把其持久地保存在磁盘上。

 

Serializable,Externalizable两个可序列化接口的区别:

  1.前者性能差,但是简单所以常用。

  2.后者性能好,但是增加了编程复杂度。

 

transient关键字,被其修饰后,不会进行JVM默认的序列化操作。在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

 

反序列化java对象必须提供该对象的class文件,随着项目的升级,java如何保证两个class文件的兼容性?

java序列化机制允许为序列化类提供一个private static final的serialVersionUID值,用于标识java类的序列化版本。

 

writeObject和readObject方法:

  1.在序列化过程中,如果被序列化的类中定义了writeObject和readObject 方法,虚拟机会试图调用对象类里的 writeObject和readObject 方法,进行用户自定义的序列化和反序列化。

  2.如果没有这样的方法,则默认调用是 ObjectOutputStream的defaultWriteObject方法以及ObjectInputStream的defaultReadObject 方法。

  3.用户自定义的 writeObject和readObject 方法可以允许用户控制序列化的过程,比如可以在序列化的过程中动态改变序列化的数值。

 

注意事项:

  1.反射,序列化和反序列化都会破坏单例设计模式。

  2.通过对Singleton的序列化与反序列化得到的对象是一个新的对象,这就破坏了Singleton的单例性。

  3.要在Singleton中定义readResolve方法,并在该方法中指定要返回的对象的生成策略,就可以防止单例被破坏。

 

本文网址:https://www.wyxxw.cn/blog-detail-8-9-1192.html

返回列表

非特殊说明,本文版权归原作者所有,转载请注明出处

提示:本站所有资源仅供学习与参考,请勿用于商业用途。图片来自互联网~如侵犯您的权益,请联系QQ:1067507709.

提示:转载请注明来自:http://www.cnblogs.com/kz2017/p/8568852.html 。 转载人:momo