文章目录
- 对象流
- 对象序列化
- 示例
- 对象序列化
- 随机存取文件流(RandomAccessFile)
- 构造函数
- 示例
- javaNIO
- NIO.2
- NIO.2中的常用类
- 类中的API
- paths
- path接口
- Files类
对象流
通过IO的学习,我们知道了java中存在很多种流stream流可以用来讲数据进行传输。下面介绍对象流
用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可 以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
- 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
- 反序列化:用ObjectInputStream类读取基本类型数据或对象的机制
ObjectOutputStream和ObjectInputStream不能序列化static和transient修 饰的成员变量
(重点在于:对象可以进行像文件一样的传输)
对象序列化
对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从 而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传 输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原 来的Java对象
序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据, 使其在保存和传输时可被还原
序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的参数和返 回值都必须实现的机制,而 RMI 是 JavaEE 的基础。因此序列化机制是 JavaEE 平台的基础
如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可 序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一。 否则,会抛出NotSerializableException异常
- Serializable
- Externalizable
这样一来不同的程序之间可以传输对象作为数据。有点Duboo的RPC意思
示例
// 编写序列化的功能
// 将对象序列化为文件存储起来
@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();
}
}
可以看到java程序中多了一个xlh.txt文件。
并且反序列出文件的对象内容
对象序列化
如果想要对象可以进行序列化,是需要满足一些要求的
上面的String默认就实现了序列化功能
- 需要实现接口Serializable
- 添加序列版本号这个值最好是唯一的。但是需要写之后可以通过Lombok插件去生成
- 类中的成员属性也是需要序列化,比如果一个Schood类中Student属性也是需要序列化的
在实际使用中,我们都是将对象转换为JSON字符串进行传输的。
随机存取文件流(RandomAccessFile)
RandomAccessFile 声明在java.io包下,但直接继承于java.lang.Object类。并 且它实现了DataInput、DataOutput这两个接口,也就意味着这个类既可以读也 可以写。
RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意 地方来读、写文件 支持只访问文件的部分内容 可以向已存在的文件后追加内容
这个类可以在创建对象的时候,来确定是可读,可写等
构造函数
- public RandomAccessFile(File file, String mode)
- public RandomAccessFile(String name, String mode)
创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指 定 RandomAccessFile 的访问模式:
- r: 以只读方式打开
- rw:打开以便读取和写入
- rwd:打开以便读取和写入;同步文件内容的更新
- 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();
}
}
在硅谷的视频中下面还有更详细的。
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。
下面会对网络编程进行一些了解
NIO.2
随着 JDK 7 的发布,Java对NIO进行了极大的扩展,增强了对 文件处理和文件系统特性的支持,以至于我们称他们为 NIO.2。 因为 NIO 提供的一些功能,NIO已经成为文件处理中越来越重要 的部分。
NIO.2中的常用类
早期的Java只提供了一个File类来访问文件系统,但File类的功能比较有限,所 提供的方法性能也不高。而且,大多数方法在出错时仅返回失败,并不会提供异 常信息。
NIO. 2为了弥补这种不足,引入了Path接口,代表一个平台无关的平台路径,描 述了目录结构中文件的位置。Path可以看成是File类的升级版本,实际引用的资 源也可以不存在。
类中的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) | 判断文件是否不存在 |