java中io流的复习总结+序列化+顺序化

本文详细介绍了Java中的字节流和字符流,包括它们的基础类如InputStream、OutputStream、BufferedInputStream和BufferedReader,以及它们在处理文件和实现序列化/反序列化中的应用。同时探讨了如何通过序列化实现对象的存储和比较排序。
摘要由CSDN通过智能技术生成

1、首先是java中的不同流。Java中可以分为三种流,输出流和输入流,字节流和字符流,普通流和处理流。字节流也就是操作字节,在utf-8中,中文是3个字节,在unicode中,中文是2个字节,在gbk中,中文也是2个字节。经过深入了解,字符流和字节流都有一个类似的流(缓存流),也就是以buffer起头的类,对于字符流来说,由于其已做处理,因此在其基础上加缓存,效果不会很明显,然而,字节流经过缓存后,效率高很多,相当于多次的小输入变化为一次大的输入任何存入缓存池,无需多次io。

io中流的介绍

字节流

InputStream:InputStream是所有字节输入流的抽象基类,前面说过抽象类不能被实例化,实际上是作为模板而存在的,为所有实现类定义了处理输入流的方法。
FileInputSream:文件输入流,一个非常重要的字节输入流,用于对文件进行读取操作。
PipedInputStream:管道字节输入流,能实现多线程间的管道通信。
ByteArrayInputStream:字节数组输入流,从字节数组(byte[])中进行以字节为单位的读取,也就是将资源文件都以字节的形式存入到该类中的字节数组中去。
FilterInputStream:装饰者类,具体的装饰者继承该类,这些类都是处理类,作用是对节点类进行封装,实现一些特殊功能。
DataInputStream:数据输入流,它是用来装饰其它输入流,作用是“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。
BufferedInputStream:缓冲流,对节点流进行装饰,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送,效率更高。
ObjectInputStream:对象输入流,用来提供对基本数据或对象的持久存储。通俗点说,也就是能直接传输对象,通常应用在反序列化中。它也是一种处理流,构造器的入参是一个InputStream的实例对象。


字符流

InputStreamReader:从字节流到字符流的桥梁(InputStreamReader构造器入参是FileInputStream的实例对象),它读取字节并使用指定的字符集将其解码为字符。它使用的字符集可以通过名称指定,也可以显式给定,或者可以接受平台的默认字符集。
BufferedReader:从字符输入流中读取文本,设置一个缓冲区来提高效率。BufferedReader是对InputStreamReader的封装,前者构造器的入参就是后者的一个实例对象。
FileReader:用于读取字符文件的便利类,new FileReader(File file)等同于new InputStreamReader(new FileInputStream(file, true),"UTF-8"),但FileReader不能指定字符编码和默认字节缓冲区大小。
PipedReader :管道字符输入流。实现多线程间的管道通信。
CharArrayReader:从Char数组中读取数据的介质流。
StringReader :从String中读取数据的介质流。

再深入了解,再对不同类的方法进行解析。

字节输入流InputStream主要方法:

read() :从此输入流中读取一个数据字节。
read(byte[] b) :从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
read(byte[] b, int off, int len) :从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
close():关闭此输入流并释放与该流关联的所有系统资源。
字节输出流OutputStream主要方法:

write(byte[] b) :将 b.length 个字节从指定 byte 数组写入此文件输出流中。
write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
write(int b) :将指定字节写入此文件输出流。
close() :关闭此输入流并释放与该流关联的所有系统资源。
字符流方法
字符输入流Reader主要方法:

read():读取单个字符。
read(char[] cbuf) :将字符读入数组。
read(char[] cbuf, int off, int len) : 将字符读入数组的某一部分。
read(CharBuffer target) :试图将字符读入指定的字符缓冲区。
flush() :刷新该流的缓冲。
close() :关闭此流,但要先刷新它。
字符输出流Writer主要方法:

write(char[] cbuf) :写入字符数组。
write(char[] cbuf, int off, int len) :写入字符数组的某一部分。
write(int c) :写入单个字符。
write(String str) :写入字符串。
write(String str, int off, int len) :写入字符串的某一部分。
flush() :刷新该流的缓冲。
close() :关闭此流,但要先刷新它。
另外,字符缓冲流还有两个独特的方法:

BufferedWriter类newLine() :写入一个行分隔符。这个方法会自动适配所在系统的行分隔符。
BufferedReader类readLine() :读取一个文本行。


File中序列化的解析:

File类实现了Serializable、 ,说明它是支持序列化和排序的。

序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转化成二进制的过程。

反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

序列化是在写入文件后,就类似于静止,只有通过jvm动态获取的时候,他才会恢复成对象,在实际应用中,我认为也是非常常用的,当操作同一对象,经常性的输入与输出,只需要强转即可完成,十分方便。

日常中通过file 的序列化,与ObjectOutputStream包装流进行配合,

输出(序列化):

Student student = new Student("John Doe", 20, "Computer Science");

ObjectOutputStream out = new ObjectOutputStream(fileOut)) { out.writeObject(student); System.out.println("对象已序列化并保存到文件");

输入(反序列化):

FileInputStream fileIn = new FileInputStream("student.ser");

ObjectInputStream in = new ObjectInputStream(fileIn));

Student deserializedStudent = (Student) in.readObject();

System.out.println("从文件反序列化对象成功");

java中顺序化的实际应用:

实现Comparable,在类中重写方法public int compareTo(student o) {或者public int compare(T o1, T o2) {}

// 按照年龄升序排序

return this.age - o.age;

return o1-o2;

// 按照年龄降序排序

return o.age - this.age;

return o2-o1;

}

  • 49
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值