java IO笔记

java IO笔记

1.java IO流程:

java IO笔记

2.java IO体系:

1.最基本的两个类 InputStreamOutputStream
InputStream提供了read()read(byte[] b,int off,int len), available(), close(), mark(), reset(), skip()等方法。
OutPutStream提供了write(),write(byte[] b,int off,int len), close(), flush()(没有具体代码)等方法。

2.下一层类为节点流,包括:
基于内存的ByteArrayInputStreamByteArrayOutputStream;
基于String的StringBufferInputStream,StringOutputStream;
基于文件的FileInputStream,FileOutputStream;
基于管道的PipedInputStream,PipedOutputStream;
串联的SequeceInputStream, SequeceOutputStream

再下一层为处理流(过滤流),父类为FilterInputStream/FilterOutputStream.它们的子类利用装饰器模式,传入一个节点流,给它添加上一些功能,比如:
加缓存的:BufferedInputStream,BufferedOutputStream;
显示行号的:LineNumberInputStream,LineNumberOutputStream;
将输入输出转换成基本类型的:DataInputStream,DataOutSteam;
打印基本类型的:PrintStream.

注意:
StringBufferInputStream中的buffer表示的是这个string来源于内存缓存区;
BufferedInputStream中的Bufferd多了个ed,表示这个是用来进行缓存操作的,两者意义不一样;

3.过滤流的各个实现,以一个输入/输出流为初始化参数,运用装饰器模式,对输入的节点流的原始方法进行装饰,添加相应的功能,以达到显示行号、缓存、把字节转换成基本类型等效果,也就是帮他人做嫁妆,给别锦上添花。

4.java IO有两条线:
一条是InputStream,OutputStream这条线,提供基本的字节流式读写操作方法;
另一条是DadaInput,DataOutput,提供直接读取布尔型,整形,数字类型等基本类型数据的方法;
他们俩可以融合,一般来说也必须融合,因为DataInput,DataOutput底层还是需要InputStream,OutputStream类读写;

5.RadomAccessFile近似于DataInputStreamDataOutputStream联合使用,还提供了seek()方法来定位到某一位置,getFilePointer()方法来获取当前位置,以及length()来获取文件的长度。另外,它只用来操作文件,不能操作内存数据;

6.File本身只是对路径的一种封装,它本身不涉及任何读写操作,也就是说它和InputStreamOutput Stream没任何关系,他只包含对文件(夹)路径的一些操作;

7.PrintStreamDataOutputStream比较:
相同点:
(1). 都继承自FileterOutputStream;
(2). 都能格式化数据;

不同点:
(1).所运用的编码不同:
DataOutputStream用UTF-8编码,
PrintStream可以自己指定编码,默认为utf8;
(2).异常机制不一样:
DataOutPutStream需要手动处理异常;
PrintStream不需要,他不会抛异常,而是保存在他里面,用CheckError来判断是否有异常;
(3).构造函数不一样:
DataOutPutStream构造参数为OutputStream;
PrintStream构造参数除了Output Stream还可以是File,他还可以自动刷新;
(4).目的不一样:
DataOutPutStream为了装饰其他流;
PrintStream为了方便的打印格式化数据
(5). 写数据的方法名不同:
DataOutPutStream方法名类似writeChar(int char), writeDouble(Double d), writeUTF()的writeXxx()格式;
PrintStream方法名类似print (int i), print (String s)格式;

8.WriterReader类是在jdk1.1之后才出现,为了解决国际化问题:InputStream和Output Stream只支持8位字节流,而java的Char是十六位的unicode编码,这样可能出现加载半个字符的问题,所以要扩展。所以,Writer/Reader的用法和InputStream/Output Stream大同小异。

9.java系列化的两种方法SerializableExternazable的比较:
(1).Serializable的一切都默认化了,没有什么可配置的,这个接口本身也没事实际的代码,只是一个标志,除了可以用transient来设置不需要系列化的字段外,再没有其他可设置和扩展的余地了;而Externazable可以自定义系列化和反系列化的操作函数WriteExternal(ObjectOutput out), ReadExternal(ObjectInput in);
(2). 可以理解成Serializable会自动组装数据,传输的是一个组装好的完整数据,反系列化时直接翻译过来就行;而Externazable在系列化时要走一遍ReadExternal(ObjectInput in);反系列化时要走一遍构造方法和自定义的WriteExternal(ObjectOutput out),他相当于是动态生成的数据,甚至他里面的成员变量也不能自动赋值,而要通过方法里的代码赋值,不然就为null;
(3).也正因为上述第二点,Externazable需要手动在WriteExternal(ObjectOutput out) 中将需要系列化的字段和值调用out.writeObject()写进去;在ReadExternal(ObjectInput in)中将需要反系列化的字段和值调用in.readObject()写进去

10.如果在系列化一个对象object时,writeObject(object)方法调用了多次,
如果输出的流是同一个,反系列化后得到的两个对象指向的是同一个对象;
如果输出的流不是同一个,反系列化后得到的两个对象指向的不是同一个对象;