Java中的输入输出流IO
- 1. Hello java.io
- 2. Java.io.file
- 3. 文件遍历案例
- 4. 文件过滤器FileFilter
- 5. 绝对与相对路径
- 6. IO流概述
- 7. java.io.OutputStream(字节输出)
- 8. java.io.FileOutputStream实体类(OutputStream子类)
- 9. java.io.InputStream(字节输入)
- 10. java.io.FileInputStream实体类(InputStream子类)
- 19. Properties类 和 .properties文件(Map子类)
- 20. try-with-resourcess(IO中的异常处理)
- 21. 序列化与反序列化技术
- 22. Serializable接口实现序列化和反序列化
- 23. 部分属性的序列化和反序列化(Serializable接口下)
- 24. Externalizable接口实现序列化和反序列化(Serializable子类)
- 25. Serializable和Externalizable的区别
概念: io:in out。对计算机或网站资源的读取和写出。对文件的增删改查遍历操作,对文件字节上数据的读取和写出,对文本文件进行字符上的读取和写出。
概念: file是文件和目录路径名的抽象表示。
构造方法:
常用方法:
eg:
字段
作用:跨平台系统时所有的路径符号应使用字段来替换以免不同系统的表示不同而出错。
eg: 查看目前系统的字段表示符号:System.out.println(File. pathSeparator)
eg: 写一个方法在E盘中遍历查找后缀为.avi的文件且大小大于200MB
格式:
注意: return true表示保留该文件,return false表示剔除该文件。
创建一个匿名的内部类文件过滤器:
绝对路径: 从盘符开始,是一个完整的路径。例如:E://a.txt。
相对路径: 在Java代码中是相对于项目目录路径,这是一个不完整的便捷路径,在Java开发中很常用。例如:a.txt。
IO流概述:
- 可以将这种数据传输操作,看作一种数据的流动,按照流动的方向分别为输入Input和输出Output。
- Java中的IO操作主要指的是Java.io包下的一些常用类的使用,通过这些常用类对数据进行读取(输入Input)和写出(输出Output)。
IO流的分类:
- 按照流的方向来分,可以分为:输入流和输出流。
- 按照流动的数据类型来分,可以分为:字节流和字符流。
字节流和字符流的顶级父类:
- 字节流:
输入流:InputStream
输出流:OutputStream - 字符流:
输入流:Reader
输出流:Writer
注意:输入输出流最后记得尽可能早地使用close();对流进行关闭。
一切皆字节:
- 8个二进制的bit位(即00000000)是一个字节。
- 计算机中的任何数据(文本,图片,视频,音乐等等)都是以二进制的形式存储的。
- 在数据传输时也都是以二进制的形式存储的。
- 后续学习的任何流,在传输时底层都是二进制。
构造方法: 常用方法:
构造方法:
eg:
构造方法: 常用方法:
构造方法:
eg:
概念: 存储和读取键=值的文件。
常用构造方法: 常用方法:
概念: 在try-catch代码块结束时自动调用close()。 使用try自动关闭的流对象必须有close()方法,如果是自定义的类对象,则需要实现Closeable接口并重写close()方法。
格式:
自定义的类对象中:
eg:
概念:
Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过 程。通过徐序列化和反序列化实现网络传输、本地存储的目的。序列化是指把对象以字节方式存储到文件中,反序列化是指把文件中的对象读取出来。由于文件中存储的是对象数据,所以直观上看是一堆乱码。由于未来该技术可能会被摒弃(出现bug),所以不太建议使用。
相关类:
相关类的概念:
- ObjectOutputStream: 将Java对象的原始数据类型和图形序列化写入OutputStream。
- ObjectInputStream: 对先前使用ObjectOutputStream编写的原始数据和对象进行反序列化。
相关类的常用方法:
序列化的对象对应的类必须实现一个标记接口:
概念: 要实现Java对象的序列化,只要将类实现标识接口——Serializable接口即可,不需要我们重写任何方法就可以实现序列化。
注意: 如果序列化的类中存在其他类的实例化对象,则其他类也要实现Serializable接口!
如果是java内置类,如Scanner的实例化对象,则需要加上static或transient修饰符使其不参加序列化!否则会有NotSerializableException错误异常。
eg:
实现部分字段序列化的三种方式:
- 使用transient修饰符;
- 使用static修饰符;
- 默认方法writeObject和readObject;
使用transient修饰符: 修改实体类,将实体类中不想序列化的属性添加transient修饰词。
使用static修饰符: 修改实体类,将实体类中不想序列化的属性添加static修饰词。
默认方法writeObject和readObject: 修改实体类,将实体类中想序列化的属性添加到这两个方法中。
readObject的调用逻辑和writeObject一样。如果目标类中没有定义私有的writeObject或readObject方法,那么序列化和反序列化的时 候将调用默认的方法来根据目标类中的属性来进行序列化和反序列化,而如果目标类中定义了私有的 writeObject或readObject方法,那么序列化和反序列化的时候将调用目标类指定的writeObject或 readObject方法来实现。
eg:
概念:
- Externalizable继承自Serializable。使用Externalizable接口需要实现readExternal方法和 writeExternal方法来实现序列化和反序列化。
- Externalizable接口中定义了writeExternal和readExternal两个抽象方法,这两个方法其实对应 Serializable接口的writeObject和readObject方法。可以这样理解:Externalizable接口被设计出来的 目的就是为了抽象出writeObject和readObject这两个方法,但是目前这个接口使用的并不多。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/204035.html