File类

相关定义

定义

File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)
File类声明在java.io包下

File类三种构造器

相对路径与绝对路径

相对路径:相较于某个路径下,指明的路径
绝对路径:包含盘符在内的文件或文件目录的路径

路径分隔符

windows:\
unix: /

IO流概述

流的分类

说明

操作数据单位:字节流、字符流
数据的流向:输入流、输出流
流的角色:节点流、处理流

图示

image.png

流的体系结构

image.png

红框对应的是IO流中的4个抽象基类 蓝框的流需要重点关注

重点说明的几个流机构

抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
InputStream FileInputStream (read(byte[] buffer)) BufferedInputStream (read(byte[] buffer))
OutputStream FileOutputStream (write(byte[] buffer, 0, len)) BufferedOutputStream (write(byte[] buffer, 0, len) / flush())
Reader FileIReader(read(char[] cbuf)) BufferedReader (read(char[] cbuf) \ readLine())
Writer FileWriter(write(char[] cbuf,0,len)) BufferedWriter (write(char[] cbuf,0,len) \ flush())

输入、输出的标准化过程

输入过程

①创建File类的对象,指明读取的数据的来源。(要求此文件一定要存在)
②创建相应的输入流,将File类的对象作为参数,传入流的构造器中
③具体的读入过程
创建相应的byte[] 或 char[]
④关闭流资源

程序中的出现的异常需要使用try-catch-finally处理

输出过程

①创建File的对象,指明写出的数据的位置
②创建相应的输出流,将File类的对象作为参数,传入流的构造器中
③具体的写出过程
④关闭流资源

程序中的出现的异常需要使用try-catch-finally处理

编码表

image.png

对象流(序列化 与 反序列化)

序列化

将内存中的Java对象保存到磁盘中或通过网络传输出去

  1. /**
  2. * 序列化过程:将内存中的Java对象保存到磁盘中或通过网络传输出去
  3. * 使用ObjectOutputStream实现
  4. */
  5. @Test
  6. public void testObjectOutputStream() throws IOException {
  7. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("hello.txt"));
  8. oos.writeObject(new String("123"));
  9. oos.flush();
  10. oos.writeObject(new Person("测试", 19));
  11. oos.flush();
  12. oos.close();
  13. }

反序列化

将磁盘文件中的对象还原为内存中的一个java对象

  1. /**
  2. * 反序列化过程:将磁盘文件中的对象还原为内存中的一个java对象
  3. * 使用ObjectInputStream实现
  4. */
  5. @Test
  6. public void testObjectInputStream() throws IOException, ClassNotFoundException {
  7. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("hello.txt"));
  8. String str = (String) ois.readObject();
  9. Person p = (Person) ois.readObject();
  10. System.out.println(str);
  11. System.out.println(p);
  12. ois.close();
  13. }

自定义类的序列化、反序列化

要求

要想实现序列化,需要实现以下要求
1.需要实现接口: Serializable
2.需要当前类提供一个全局常量: serialVersionUID
3.除了当前类需要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的(默认情况下,基本数据类型可序列化)
4.ObjectOutputStream和ObjectInputStream不能序列化 or 反序列化static和transient修饰的成员变量

serialVersionUID

serialVersionUID用来表名类的不同版本间的兼容性。其目的是以序列化对象进行版本控制,有关各版本反序列化时是否兼容
Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。
在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常
如果没有显示定义这个静态常量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的实例变量做了修改,serialVersionUID可能发生变化。故建议显示声明

RandomAccessFile的使用

使用

RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则执行过程中自动创建文件
可以通过相关的操作,实现RandomAccessFile”插入”数据的效果

可以使用RandomAccessFile这个类,来实现一个多线程断点下载的功能。用过下载工具的朋友们都知道,下载前都会建立两个临时文件,一个与被下载文件大小相同的空文件,另一个是记录文件指针的位置文件,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上一次的地方下载,从而实现断点下载或上传的功能

NIO

概述

Java NIO是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO API。它与IO有相同的作用和目的,但是使用方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作(IO是面向流的)。NIO将以更加高效的方式进行文件的读写操作
Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO

Channel(通道) |——java.nio.channels.Channel |——FileChannel:处理本地文件 |——SocketChannel:TCP网络编程的客户端的Channel |——ServerSocketChannel:TCP网络编程的服务器端的Channel |——DatagramChannel:UDP网络变成中发送端和接收端的Channel

Path、Paths和Files核心API

早期的Java只提供了一个File类来访问文件系统,但File类的功能比较有限,所以提供的方法性能也不高。而且,大多数方法在出错时进返回失败,并不会提供异常信息
NIO.2为了弥补这种不足,引入了Path接口,代表一个平台无关的平台路径,描述了目录结构中文件的位置。Path可以看成是File类的升级版本,实际引入的资源也可以不存在。