I/O 流

I/O 流

本章目标

  • 掌握文件操作

  • 了解 I/O 流的概念

  • 掌握 I/O 流的分类

  • 掌握 I/O 流通用操作步骤

  • 重点掌握主要 I/O 流的使用方法

  • 掌握对象序列化和反序列化


File 类

File 类是 Java 提供与平台无关用于操作计算机文件和目录的类(File 对象表示文件或目录)

主要方法
  • boolean createNewFile() :创建一个空文件

  • boolean delete():删除一个文件或目录

  • boolean isDirectory():判断是否目录

  • boolean isFile():判断是否文件

  • boolean mkdir():创建一个空目录

  • File[] listFiles():获取目录中的文件对象数组

  • long length():获取文件大小(字节)

  • boolean exists():判断文件或目录是否存在

绝对路径

绝对路径是以根目录开头的完整路径

C: \\ hello \\ hello.txt
  • Windows平台使用 \ 作为路径分隔符(在 Java 字符串中需要用 \ 转义符表示一个 \ 分割符,即 \\ )

  • Linux平台使用 / 作为路径分隔符

  • File.separator 可以根据当前平台显示对应分割符

相对路径

相对路径是以当前程序所在目录开头的路径

hello.txt
. \\ hello.txt
.. \\ hello \\ hello.txt
  • . 表示当前路径

  • .. 表示当前路径的上级目录

流的基本概念

流就是传输数据的管道

流的分类

流的方向
  • 输出流(内存->硬盘)

  • 输入流(硬盘->内存)

流的大小
  • 字节流(1个字节)

  • 字符流(2个字节)

流的四大抽象类

image-20210801091916250

InputStream 抽象类

InputSteam 抽象类的方法是所有子类或具体类共有的方法

  • close():关闭输入流

  • read():从输入流中读取一个字节

  • read(byte[] b):从输入流中读取一些字节并存入数组中

  • read(byte[] b,int off, int len):从输入流中读取指定长度字节并存入数组中

操作步骤

  • 创建输入流对象

  • 从输入流中读入数据

  • 关闭输入流对象

//创建文件输入流对象
FileInputStream fileInputStream = new FileInputStream(“1.txt”);
​
//从文件中读取数据到内存
int length = 0;
byte [ ] buffer  = new byte[1024];
// 当文件读取到结尾时返回 -1
while( ( length = fileInputStream.read(buffer) )  !=  -1 )  {
     System.out.println(new String(buffer,0, length));
}
​
//关闭文件输入流
fileInputStream.close();
OutputStream 抽象类

OutputSteam 抽象类的方法是所有子类或具体类共有的方法

  • close():关闭输入流

  • write(byte[] b):将指定字节数组的数据写入到输出流

  • write(byte[] b, int off, int len):将指定数组中从偏移量 off 开始的 len 个字节写入到输出流

操作步骤

  • 创建输出流对象

  • 从输出流中写入数据

  • 关闭输出流

//创建空文件
File file =  new File(“1.txt");
//创建文件输出流                      
FileOutputStream fileOutputStream = newFileOutputStream(file);
​
//从控制台输入字符串
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
byte[ ] buffer =  str.getBytes();
// 向文件写入字节数组保存的数据
fileOutputStream.write(buffer,0, buffer.length);
​
//关闭文件输出流                      
fileOutputStream.close();
Reader 抽象类

Reader 抽象类有两个常用具体实现类:FileReader 类和 BufferedReader 类

FileReader 类

以字符流的形式读取文件(与 FileInputStream 类用法基本一致)

BufferedReader 类

将字符流读入到一个缓冲区,然后从缓冲区读取数据,并且提供 readLine( ) 方法,可以从文本文件中整行的读取数据

Writer 抽象类

Writer 抽象类有两个常用具体实现类:FileWriter 类和 BufferedWriter 类

FileWriter 类

以字符流的形式写入文件(与 FileOutputStream 类用法基本一致)

BufferWriter 类

将字符流写入到一个缓冲区,然后从缓冲区将数据写入文件

流的类结构图

image-20210801092009149

文件读写流
FileInputStream 和 FileOutputStream

以字节为操作单位的文件输入流和文件输出流,利用这两个类可以对所有文件进行读写操作

FileReader 和 FileWriter

以字符为操作单位的文件输入流和文件输出流,利用这两个类可以对字符文本文件进行读写操作

BufferedInputStream 和 BufferedOutputStream

针对字节的缓冲输入流和输出流,利用这两个类可以提高数据读写的速度。因为它们会创建一个内部缓冲区数组,所有读取或写入的字节,都会先填充这个缓冲区,然后一次性读取或写入到目标数据源中

BufferedReader 和 BufferedWriter

针对字符的缓冲输入流和输出流,利用这两个类可以提高数据读写的速度,BufferedReader 还支持读取整行数据

内存流

内存流就是在内存中读写数据 (数据在内存中处理比磁盘(或硬盘)要快很多,有时候可能需要临时在内存中保存并处理数据,内存流效率会更高)

image-20210801093225342

ByteArrayInputStream

包含一个内部缓冲区,该缓冲区包含从流中读取的字节

ByteArrayOutputStream

实现一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长,可使用 toByteArray() 和 toString() 获取数据。

CharArrayReader

实现一个可用作字符输入流的字符缓冲区

CharArrayWriter

实现一个可用作 Writer 的字符缓冲区。缓冲区会向流中写入数据而自动增长。可使用 toCharArray() 和 toString() 获取数据

内存流无需调用 close( ) 方法关闭,因为内存流无需建立内存与磁盘之间的连接通道,因此不用关闭内存流

其他流
ZipInputStream 和 ZipOutputStram

实现 ZIP 压缩文件的读取和写入功能

PrintStream 和 PrintWriter

实现提供一系列的 print 和 println 方法(System.out.println 中的System.out就是 PrintStream 的实例)

DataInputStream 和 DataOutputStream

实现从文本读取和写出到文本的基本类型的数据

InputStreamReader 和 OutputStreamWriter

实现字节流和字符流之间的转换

RandomAccessFile

实现在文件的任何地方(随机)读取或写入数据

对象序列化与反序列化

对象流

对象流是 Java I/O 流中非常特殊的流,它可以将 Java 对象直接写入到硬盘中,在需要时又可以从硬盘中重新读入内存并恢复成原对象

image-20210801093634099

序列化与反序列化特点
  • 序列化类必须实现 java.io.Serializable 序列化标识性接口(没有抽象方法)

//凡是实现序列化接口的类都有一个表示序列化版本标识的静态变量
private static final long serialVersionUID; //用来表明类的不同版本的兼容性
  • 序列化类 static 属性和方法代码不会被序列化处理

  • 使用 transient 关键字标明不需要序列化的非 static 属性(成员变量)

posted @ 2021-08-25 18:07  嘛了对就念来过倒  阅读(61)  评论(0)    收藏  举报