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());

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

相关推荐
何曾参静谧1 分钟前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
程序媛小果7 分钟前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林13 分钟前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨27 分钟前
El表达式和JSTL
java·el
q5673152327 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
是萝卜干呀28 分钟前
Backend - Python 爬取网页数据并保存在Excel文件中
python·excel·table·xlwt·爬取网页数据
代码欢乐豆29 分钟前
数据采集之selenium模拟登录
python·selenium·测试工具
Mortal_hhh37 分钟前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
许野平1 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨1 小时前
在JS中, 0 == [0] 吗
开发语言·javascript