java学习(12)-一些数据流的描述



说明

IO流

其实就是输入输出流,其顶层为字节输入,输出流,字符输入,输出流.


字节流

因为所有的文件其实都是以二进制存储,所以字节流可以读取任意的文件


OutputStream

  这是一个输出字节流的超类,是抽象类,定义了如flush(),close(),write()等方法
具体的实现在其子类当中,可以将内存中的数据写入到文件当中.
具体的实现流程是java程序通过jvm访问os,然后调用os的写数据的方法,然后将数据写到文件中.


FileOutputStream

  文件输出字节流,其使用步骤就类似File类的子类对文件的操作,首先提供地址给构造方法创造对象,然后根据对象对文件进行写入操作,但是需要注意构造器中相当于开启这个文件的访问,使用结束之后需要关闭
  在写入过程中需要注意是字节流,也就是写入的二进制字节.
  写入方法除了write()传入单个字符之外,还可以通过byte[]数组传入数据,并且还有方法可以设置传入数组的开始和结束,但是需要注意一个问题,因为传入的字节流,所以很可能出现字节解码出现乱码.


FileOutputStream

  其构造方法有续写开关,也就是说是对文件进行续写还是重写写成一个文件.默认情况下是不续写,但是在构造方法中有FileOutputStream(String name, Boolean append);可以选择是否开启续写模式,开启之后会在文件末尾继续输入内容.
  关于文件内容的换行,不同操作系统不同.windows:\r\n linux:/n mac:/r
  并且对于字符串的写入需要使用getByte()方法获取其对应的字节码.


InputStream

  其实是一个字节输入流的超类,其中定义方法和输出流基本相同,只是write()方法变成了read()方法.
  具体实现在其子类中,其实现流程和写入其实一样,都是通过虚拟机访问os来实现的.


FileInputStream

  就是文件字节输入流,其中的构造方法没有输入流类似的续写标记.
  其中的read()方法是读取一个字节,如果需要循环读出,需要注意读出的内容赋值之后在循环中判断,因为如果判断语句读一次,循环体又读一次,实际上就会跳过很多字节.
  如果需要读出多个字节可以使用read(byte[] b)来获取指定长度的数组,读出之后进行相应的解码,比如说转换为String类,通过String类的构造器传入byte[]就可以实现转换.

  需要注意一个问题,byte[]数组其实是起到一个缓冲区的作用,一般情况下设置为1024,但是数组的获取有一个问题,就是read()方法其实是把指针不断地向后移,所以会出现已经读完文件的内容,但是指针还没有到达末尾,还可以继续读取的问题.所以实际操作中一般使用读取的长度来判断是否读完.也就是说:

while((len = fis.read(bytes))!=-1){
	new String(bytes, 0, len);
}

  上面的文件输入输出流可以实现任意文件的读取写入,也就可以实现文件的复制,如果使用数组作为缓冲器可以提高一些效率.


Reader

  其实就是字符输入流,因为对于中文来说不是字节实现的,所以需要字符来获取完整的内容.
  其中定义的方法和字节流中其实类似,只是实现方式是字符而不是字节.


FileReader

其中方法和具体使用方式都和字节流一样的,只是输入的流是字符流,使用的是char[]数组,但是字符流需要注意编码问题,字节流不会出现什么问题,但是字符流对于不同的编码就会出现乱码的问题,因为读取的字符在不同编码格式中是不同个数的字节.

Writer和FileWriter和上面也一样,就不赘述了.


字符字节流的flush()和close()

  其实就是flush()是刷新缓冲区,将缓冲区中内容加载到文件中,然后可以继续使用流对象.
但是close()就是先刷新缓冲区,然后关闭对于流对象的使用.


IO异常的处理

  大多是使用trycatch解决,jdk7之后可以不用写finally对资源释放,try中代码完成之后会自动结束.
jdk9则是在try(参数){}语句中传入需要关闭资源的对象,然后实现资源只在try中有效.


Properties

  继承了HashTable,其实表示的是一个持久的属性集合,是唯一一个和IO流相结合的集合,所以仍在使用.其实就是可以调用方法将键值对内容通过输入输出流直接到达内存中的文件.
  实质上存储的内容默认是String类型的
  主要使用的是store()方法和load()方法
  其中store()方法传入两个参数,一个是字节或者字符的输出流对象,另一个是注释采用String类型.使用properties对象调用方法之后可以把集合中的内容存入到内存的文件当中,但是需要注意字节流是可以输入中文的注释,但是字符流不行因为编码可能出现问题.
  实际输入的时候会首先输入注释内容,然后为自动输入的时间信息注释,接下来才是集合的内容.
  load()方法则是将文件的键值对读取到集合当中,同样可以使用字节流或者字符流.注释内容不会被读取到集合中,读取的键值对可以是=分隔或者空格分隔.


缓冲流

  其实就是对于字符流和字节流的扩展,也就是说对域普通的流加了一个缓冲区使得流不需要因为大量小的数据而开启,浪费时间.缓冲一块足够大的数据再进行写入或者输出能够有效减少读写管道开启的时间消耗.
  所以也分为字节/字符缓冲输出/输入流四种类型的流.


BufferedOutputStream

  字节缓冲输出流,继承自父类OutputStream.具有相同点开启关闭流,写入等方法
其构造器BufferedOutputStream(OutputStream out),可以看出使用缓冲流需要传入一个输出流的对象,其构造器还可以传入一个int作为缓冲区的大小.
  所以使用流程可以总结为,先创建输出流的对象,再创建缓冲流的对象,再进行操作,然后刷新资源,最后关闭资源.当然其输出流对象也需要关闭,因为创建对象之后都会打开资源,而这个资源不能垃圾回收,只有其对象可以回收.


BufferedInputStream

具体的使用和字节缓冲输出流相同,其中的区别就是字节输入流和输出流的区别,不想赘述.


BufferedWriter

字符缓冲输出流,不赘述了.


BufferedReader

字符缓冲输入流,不赘述了


字符编码

其实就是将字符按照一套规则编码成字节.相同编码格式编码解码才会是正确内容


字符集

其实就是不同编码对应的编码表.
常见的如ASCLL,ISO-8859-1,GB2312,GBK,Unicode,UTF-8等


InputStreamReader

  是一个可以指定编码格式的字节到字符流,其构造器传入一个输入流,一个编码格式,然后就可以调用该类对象将内容以指定格式输出.实际上使用和缓冲输入流是一样的.
  只传入输入流的构造器中默认编码格式为utf-8


OutputStreamWriter

  就是指定编码格式的输出流,具体使用和输入的一样,注意关闭资源,不赘述


序列化和反序列化

  就是把对象转换为文件存储,然后再解析为对象到程序中.这么做是为了减少对象太多对于内存的占用,特别是对于一些大量用户访问的程序,或者是对象构造很复杂的时候,就需要将这些过于复杂的对象,序列化到高性能计算机中运行,然后再返回给微计算机或者说客户端去调用.


ObjectOutputStream

  继承了输出流,其实实际使用的时候和普通的输出流相似,也是构造器中传入输出的位置,然后对象调用方法写入,只不过这里写入的是一个对象,而这个对象对应的类需要实现一个标记接口Serializable,这个接口只是一个标记表示需要序列化,其中其实没有需要实现的内容.


ObjectInputStream

  继承自输入流,其实操作也和输出流一样,只是对于read()方法会有一个异常需要处理,就是读取的序列化文件中的对象的类找不到的时候的异常.也就是说再服务器端发送对象到客户端,客户端需要有对应对象的类,否则不能反序列化.


transient关键字

  瞬态关键字,其实就是修饰变量之后可以使得变量不能被序列化,那么这样就可以减少很多不必要信息传递的内存或者隐藏不应该传输的数据.其实使用static修饰也不能被序列化.

  如果反序列化成功之后对类进行修改就会导致其序列号改变,从而导致序列化失败.这也是Serializable接口实现的原因,会对类生成一个serialVersionUID进行判断是否类不同.但是可以手动解决这个问题,也就是赋予一个序列号,因为对类进行一些不会影响运行的修改其实没有关系,这时赋值一个序列号就能解决类不同的问题.只需要在对应类中设置一个final static long的serialVersionUID常量.


打印流PrintStream

其实就是打印System.out.println();
这个流永远不会抛出异常.



如有错误欢迎读者批评指正!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值