文章目录

  • 对象流
  • 对象序列化
  • 示例
  • 对象序列化
  • 随机存取文件流(RandomAccessFile)
  • 构造函数
  • 示例
  • javaNIO
  • NIO.2
  • NIO.2中的常用类
  • 类中的API
  • paths
  • path接口
  • Files类


对象流

通过IO的学习,我们知道了java中存在很多种流stream流可以用来讲数据进行传输。下面介绍对象流

用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可 以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。

  1. 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
  2. 反序列化:用ObjectInputStream类读取基本类型数据或对象的机制

ObjectOutputStream和ObjectInputStream不能序列化static和transient修 饰的成员变量

(重点在于:对象可以进行像文件一样的传输)

对象序列化

对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从 而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传 输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原 来的Java对象

序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据, 使其在保存和传输时可被还原

序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的参数和返 回值都必须实现的机制,而 RMI 是 JavaEE 的基础。因此序列化机制是 JavaEE 平台的基础

如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可 序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一。 否则,会抛出NotSerializableException异常

  1. Serializable
  2. Externalizable

这样一来不同的程序之间可以传输对象作为数据。有点Duboo的RPC意思

示例

netty Hessian序列化_nio

//    编写序列化的功能
//    将对象序列化为文件存储起来
    @Test
    public void xlhMethod(){
//        创建一个文件用于接收
        File file = new File("xlh.txt");
        try {
//            创建字节流的输出流的节点流
            FileOutputStream fileOutputStream = new FileOutputStream(file);
//            使用序列化构造带入
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

            objectOutputStream.writeObject(new String("徐州加油"));

            objectOutputStream.flush();
            objectOutputStream.close();

        } catch (Exception e) {
            e.printStackTrace();
        }


    }

//    反序列化
//    将序列化文件转换成对象
    @Test
    public void fxlhMethod(){

        //        创建一个文件用于接收
        File file = new File("xlh.txt");
        try {
//            创建字节流的输出流的节点流
            FileInputStream fileInputStream = new FileInputStream(file);
//            使用序列化构造带入
            ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);


            Object object = inputStream.readObject();
            String str = (String)object;
            System.out.println(str);

            inputStream.close();

        } catch (Exception e) {
            e.printStackTrace();
        }


    }

netty Hessian序列化_netty Hessian序列化_02

可以看到java程序中多了一个xlh.txt文件。

并且反序列出文件的对象内容

对象序列化

如果想要对象可以进行序列化,是需要满足一些要求的

上面的String默认就实现了序列化功能

  1. 需要实现接口Serializable
  2. 添加序列版本号这个值最好是唯一的。但是需要写之后可以通过Lombok插件去生成
  3. 类中的成员属性也是需要序列化,比如果一个Schood类中Student属性也是需要序列化的

netty Hessian序列化_java_03

在实际使用中,我们都是将对象转换为JSON字符串进行传输的。

随机存取文件流(RandomAccessFile)

RandomAccessFile 声明在java.io包下,但直接继承于java.lang.Object类。并 且它实现了DataInput、DataOutput这两个接口,也就意味着这个类既可以读也 可以写。

RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意 地方来读、写文件 支持只访问文件的部分内容 可以向已存在的文件后追加内容

这个类可以在创建对象的时候,来确定是可读,可写等

构造函数

  1. public RandomAccessFile(File file, String mode)
  2. public RandomAccessFile(String name, String mode)

创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指 定 RandomAccessFile 的访问模式:

  1. r: 以只读方式打开
  2. rw:打开以便读取和写入
  3. rwd:打开以便读取和写入;同步文件内容的更新
  4. rws:打开以便读取和写入;同步文件内容和元数据的更新

如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件, 如果读取的文件不存在则会出现异常。 如果模式为rw读写。如果文件不 存在则会去创建文件,如果存在则不会创建。

示例

//    测试RandomAccessFile是否可以读可写
    @Test
    public void RandomFileTest() {

        try {
//            在创建对象的时候指定可读可写
            RandomAccessFile rw = new RandomAccessFile("random.txt", "rw");

//            进行读取random.txt文件
            int read = rw.read();
            while (read!=-1){
                System.out.print((char)read);
                read = rw.read();
            }


            System.out.println("------------------------------");

            rw.writeChars("hello,wsl");

            RandomAccessFile rw1 = new RandomAccessFile("random.txt", "rw");
            //            进行读取random.txt文件
            int read01 = rw1.read();
            while (read01!=-1){
                System.out.print((char)read01);
                read01 = rw1.read();
            }

            rw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

netty Hessian序列化_nio_04

在硅谷的视频中下面还有更详细的。

javaNIO

Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新 的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目 的,但是使用的方式完全不同,**NIO支持面向缓冲区的(IO是面向流的)、基于 通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。**总的来说就是提高了效率

Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网 络编程NIO。

netty Hessian序列化_nio_05

下面会对网络编程进行一些了解

NIO.2

随着 JDK 7 的发布,Java对NIO进行了极大的扩展,增强了对 文件处理和文件系统特性的支持,以至于我们称他们为 NIO.2。 因为 NIO 提供的一些功能,NIO已经成为文件处理中越来越重要 的部分。

NIO.2中的常用类

早期的Java只提供了一个File类来访问文件系统,但File类的功能比较有限,所 提供的方法性能也不高。而且,大多数方法在出错时仅返回失败,并不会提供异 常信息。

NIO. 2为了弥补这种不足,引入了Path接口,代表一个平台无关的平台路径,描 述了目录结构中文件的位置。Path可以看成是File类的升级版本,实际引用的资 源也可以不存在。

netty Hessian序列化_nio_06

类中的API

Path、Paths和Files核心API

同时,NIO.2在java.nio.file包下还提供了Files、Paths工具类,Files包含 了大量静态的工具方法来操作文件;Paths则包含了两个返回Path的静态 工厂方法。

paths

方法

描述

static Path get(String first, String … more)

用于将多个字符串串连成路径

static Path get(URI uri)

返回指定uri对应的Path路径

path接口

方法

描述

String toString()

返回调用 Path 对象的字符串表示形式

boolean startsWith(String path)

判断是否以 path 路径开始

boolean endsWith(String path)

判断是否以 path 路径结束

boolean isAbsolute()

判断是否是绝对路径

Path getParent()

返回Path对象包含整个路径,不包含 Path 对象指定的文件路径

Path getRoot()

返回调用 Path 对象的根路径

Path getFileName()

返回与调用 Path 对象关联的文件名

int getNameCount()

返回Path 根目录后面元素的数量

Path getName(int idx)

返回指定索引位置 idx 的路径名称

Path toAbsolutePath()

作为绝对路径返回调用 Path 对象

Path resolve(Path p)

合并两个路径,返回合并后的路径对应的Path对象

File toFile()

将Path转化为File类的对象

Files类

java.nio.fileFiles 用于操作文件或目录的工具类

方法

描述

Path copy(Path src, Path dest, CopyOption … how)

文件的复制

Path

createDirectory(Path path, FileAttribute … attr)

Path createFile(Path path, FileAttr

bute … arr)

void delete(

ath path)

void deleteIfExists(Path path)

Path对应的文件/目录如果存在,执行删除

Path move(Path src, Path dest, CopyOption…how)

将 src 移动到 dest 位置

long size(Path path)

返回 path 指定文件的大小

常用方法:用于判断

方法

描述

boolean exists(Path path, LinkOption … opts)

判断文件是否存在

boolean isDirectory(Path path, LinkOption … opts)

判断是否是目录

boolean isRegularFile(Path path, LinkOption … opts)

判断是否是文件

boolean isHidden(Path path)

判断是否是隐藏文件

boolean isReadable(Path path)

判断文件是否可读

boolean isWritable(Path path)

判断文件是否可写

boolean notExists(Path path, LinkOption … opts)

判断文件是否不存在