Java语言程序设计——篇十三(3)


🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

  • 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
    您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻

对象序列化:对象I/O流与NIO 和NIO.2:new I/O

对象序列化与对象流

  • 将程序中的对象输出到外部设备(如文件、网络)中,称为对象序列化(serialization) 。反之,从外部设备将对象读入程序中称为对象反序列化(deserialization)。
  • 一个类的对象要实现序列化,必须实现java.io.Serializable接口,该接口的定义如下。
java 复制代码
public interface Serializable{}
  • ObjectInputStream是对象输入流,继承了InputStream类,实现了ObjectInput接口。
  • ObjectOutputStream是对象输出流,继承了OutputStream类,实现了ObjectOutput接口。

用ObjectOutputStream写出对象

  • 构造方法为:
java 复制代码
 ObjectOutputStream(OutputStream out)
  • writeObject()方法格式为:
java 复制代码
final void writeObject(Object obj)   throws IOException
  • 接口还定义多个方法用来输出基本数据类型,如
java 复制代码
    public void writeInt(int v)
    public void writeFloat(float v)
    public void writeDouble(double v)
  • 下面代码将一些数据和对象写到对象输出流中。
java 复制代码
   FileOutputStream fos = new FileOutputStream("data.ser");
   ObjectOutputStream oos =  new ObjectOutputStream(fos);
   oos.writeInt(2010);        // 写出一个整数
   oos.writeObject("你好");     // 写出一个字符串
   oos.writeObject(LocalDate.now());     // 写出一个日期对象

用ObjectInputStream读出对象

  • 构造方法为:
java 复制代码
public ObjectInputStream(InputStream in)
  • readObject()方法格式为:
java 复制代码
    public final Object readObject()   throws IOException
  • 该接口中定义多个方法用来读入基本数据类型,如
java 复制代码
    public int  readInt()
    public float readFloat()
    public double readDouble()
  • 下面代码建立一个对象输入流对象。
java 复制代码
   FileInputStream fis = new FileInputStream("data.ser");
   ObjectInputStream oip = new ObjectInputStream(fis);
   int i = ois.readInt();
   String today = (String)ois.readObject();
   LocalDate date = (LocalDate)ois.readObject();
  • 对象序列化需要注意的事项:
    1️⃣序列化只能保存对象的非static成员,不能保存任何成员方法和static成员变量,而且序列化保存的只是变量的值。
    2️⃣用transient关键字修饰的变量为临时变量,也不能被序列化。
    3️⃣如果成员变量为引用类型,引用的对象也被序列化。

序列化数组

  • 数组是对象,也可以被序列化。如果数组中的所有元素都是可序列化的,这个数组就是可序列化的。
  • 一个完整的数组可以用·writeObject()·方法存入文件,之后用·readObject()·方法读取到程序中。

NIO和NIO.2

  • 为了增强Java I/O功能,在JDK 1.4中增加了一些新的API,称为New I/O(NIO), NIO API是java.nio包及其子包中定义的。
  • 在JDK 7中又新引进了一些包,称作NIO.2,用来对现有技术进行补充。NIO.2的接口和类通过java.nio.file包及其子包提供。

文件系统和路径

  • 一个文件系统可以包含三类对象:
    ① 文件
    ② 目录(也称文件夹)
    ③ 符号链接(symbolic
  • 绝对和相对路径:
    ① 绝对路径(绝对路径是以根元素为起点的路径,包含定位文件的所有信息。D:\study\user\report.txt)
    ② 相对路径相对路径是不包含根元素的路径,例如,study\com\Hello.java

FileSystem类

  • FileSystem表示一个文件系统,它是一个抽象类,可以调用FileSystems类的getDefault()静态方法来获取当前的文件系统。
java 复制代码
FileSystem fileSystem = FileSystems.getDefault();
  • FileSystem类常用方法:
java 复制代码
   abstract Path getPath(String first, String ...more)
   abstract String getSeparator()
   abstract Iterable<Path>getRootDirectores()
   abstract boolean isOpen()
   abstract boolean isReadOnly()

Path接口对象

  • 在Java 7中应使用NIO.2的java.nio.file.Path接口对象代替java.io.File。
  • 可以使用Paths(注意是复数)类的get()方法创建Path对象:
java 复制代码
   Path p1 = Paths.get("D:\\study\\com\\Hello.java");
   Path p2 = Paths.get(args[0]);
   Path p3 = Paths.get(
                   URI.create("file:///users/joe/FileTest.java"));
  • 检索路径信息:
  • Path对象可以看做是一个名称序列,每一级目录可以通过索引指定。目录结构的最顶层索引为0,目录结构的最底层元素索引是n-1,n是总层数。例如,getName(0)方法将返回最顶层目录名称。
java 复制代码
    Path path = Paths.get("D:\\study\\user\\report.txt");
    System.out.println("getFileName:" + path.getFileName());

博主用心写,读者点关注,互动传真情,只是不迷路。

相关推荐
黄林晴2 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我2 小时前
flutter 之真手势冲突处理
android·flutter
法的空间2 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止3 小时前
深入解析安卓 Handle 机制
android
Bruce1233 小时前
web专题之php代审(二)
php
恋猫de小郭3 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
道可到3 小时前
Java 反射现代实践速查表(JDK 11+/17+)
java
用户8356290780513 小时前
从手动编辑到代码生成:Python 助你高效创建 Word 文档
后端·python
jctech3 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831673 小时前
为何Handler的postDelayed不适合精准定时任务?
android