I/O 流
本章目标
-
掌握文件操作
-
了解 I/O 流的概念
-
掌握 I/O 流的分类
-
掌握 I/O 流通用操作步骤
-
重点掌握主要 I/O 流的使用方法
-
掌握对象序列化和反序列化
File 类
File 类是 Java 提供与平台无关用于操作计算机文件和目录的类(File 对象表示文件或目录)
主要方法
-
boolean createNewFile() :创建一个空文件
-
boolean delete():删除一个文件或目录
-
boolean isDirectory():判断是否目录
-
boolean isFile():判断是否文件
-
boolean mkdir():创建一个空目录
-
-
long length():获取文件大小(字节)
-
boolean exists():判断文件或目录是否存在
绝对路径
绝对路径是以根目录开头的完整路径
C: \\ hello \\ hello.txt
-
Windows平台使用 \ 作为路径分隔符(在 Java 字符串中需要用 \ 转义符表示一个 \ 分割符,即
\\) -
Linux平台使用 / 作为路径分隔符
-
File.separator 可以根据当前平台显示对应分割符
相对路径
相对路径是以当前程序所在目录开头的路径
hello.txt
. \\ hello.txt
.. \\ hello \\ hello.txt
-
. 表示当前路径
-
.. 表示当前路径的上级目录
流的基本概念
流就是传输数据的管道
流的分类
流的方向
-
输出流(内存->硬盘)
-
输入流(硬盘->内存)
流的大小
-
字节流(1个字节)
-
字符流(2个字节)
流的四大抽象类

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 类
将字符流写入到一个缓冲区,然后从缓冲区将数据写入文件
流的类结构图

文件读写流
FileInputStream 和 FileOutputStream
以字节为操作单位的文件输入流和文件输出流,利用这两个类可以对所有文件进行读写操作
FileReader 和 FileWriter
以字符为操作单位的文件输入流和文件输出流,利用这两个类可以对字符文本文件进行读写操作
BufferedInputStream 和 BufferedOutputStream
针对字节的缓冲输入流和输出流,利用这两个类可以提高数据读写的速度。因为它们会创建一个内部缓冲区数组,所有读取或写入的字节,都会先填充这个缓冲区,然后一次性读取或写入到目标数据源中
BufferedReader 和 BufferedWriter
针对字符的缓冲输入流和输出流,利用这两个类可以提高数据读写的速度,BufferedReader 还支持读取整行数据
内存流
内存流就是在内存中读写数据 (数据在内存中处理比磁盘(或硬盘)要快很多,有时候可能需要临时在内存中保存并处理数据,内存流效率会更高)

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 对象直接写入到硬盘中,在需要时又可以从硬盘中重新读入内存并恢复成原对象

序列化与反序列化特点
-
序列化类必须实现 java.io.Serializable 序列化标识性接口(没有抽象方法)
//凡是实现序列化接口的类都有一个表示序列化版本标识的静态变量
private static final long serialVersionUID; //用来表明类的不同版本的兼容性
-
序列化类 static 属性和方法代码不会被序列化处理
-

浙公网安备 33010602011771号