Java IO 流
java.io.File 类的使用
File 类
java.io.file
类:文件和目录路径名的抽象表示形式,与平台无关
File
能新建、删除、重命名文件和目录,但 File
不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
File 类的方法:
1 | 访问文件名: |
File
对象可以作为参数传递给流的构造函数。
File
类的常见构造方法:
1 | public File(String pathname) |
IO 原理及流的分类
IO 流用来处理设备之间的数据传输。
Java 程序中,对于数据的输入/输出操作以“流”的方式进行。
Java.io 包下提供了各种“流”类和接口,用以获取不同中类的数据,并通过标准的方法输入或输出数据。
输入 input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
输出 output:将程序(内存)数据输出到磁盘、光盘等存储设备中
流的分类
按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
按数据流的流向不同分为:输入流、输出流
按流的角色的不同分为:节点流、处理流
抽象基类 | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
IO 流体系
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter |
文件流
文件字节流
非常通用,可以用来操作字符的文档,还可以操作任何其他类型文件(图片、压缩包等),因为字节流直接使用二进制
文件字符输入流
读取文件操作步骤:
建立一个流对象,将已存在的一个文件加载进流
FileReader fr = new FileReader(“Test.txt”);
创建一个临时存放数据的数组
char[] ch = new char[1024];
调用流对象的读取方法将流中的数据读入到数组中
fr.read(ch);
注意
定义文件路径时,可以用 /
或 \\
在写入一个文件时,如果目录下有同名文件将被覆盖
在读文件时,必须保证该文件已存在,否则出现异常。
缓冲流
为了提高数据读写的速度,Java API 提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组。
BufferedInputStream 和 BufferedOutputStream
BufferedReader 和 BufferedWriter
对于输出的缓冲流,写出的数据会先在内存中缓存,使用 flush() 将会使内存中的数据立刻写出。
缓冲流就是先把数据缓冲到内存里,在内存中去做io操作,基于内存的io操作大概能比基于硬盘的io操作快75000多倍。
转换流
转换流提供了在字节流和字符流之间的转换
InputStreamReader
和 OutputStreamWriter
字节流中的数据都是字符时,转成字符流操作更高效。
InputStreamReader
用于将字节流中读取的字节按照字符集解码成字符,需要和 InputStream
套接.
标准输入输出流
System.in
和 System.out
分别代表了系统标准的输入和输出设备
默认输入设备是键盘,输出设备是显示器
System.in
的类型是 InputStream
System.out
的类型是 PrintStream
,其是 OutputStream
的子类 FileOutputStream
的子类
打印流
PrintStream(字节打印流)
和 PrintWriter(字符打印流)
提供了一系列重载的 print
和 println
方法,用于多种数据类型的输出。
PrintStream
和 PrintWriter
的输出不会抛出异常,有自动 flush
功能。
System.out
返回的是 PrintStream
的实例。
数据流
读取基本数据类型
DataInputStream
DataOutputStream
对象流
ObjectInputStream
ObjectOutputStream
用于存储和读取对象的处理流。它的强大之处就是可以把 Java 中的对象写入到数据源中,也能把对象从数据源中还原回来。
序列化(Serialize):用 ObjectOutputStream
类将一个 Java 写入IO流中
反序列化(Deserialize):用 ObjectInputStream
类从IO流中恢复该 Java 对象
不能序列化 static 和 transient 修饰的成员变量。因为序列化和反序列化针对的是对象的各种属性,不包括类的属性。
序列化的好处是可将任何实现了 Serializable 接口的对象转换为字节数据,使其在保存和传输时可被还原。
如果需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口:Serializable
、Externalizable
一般用后面那个
凡是实现了 Serializable
接口的类都有一个表示序列化版本标识符的静态变量:
private static final long serialVersionUID;
serialVersionUID
表示不同版本的兼容性
若某个类实现了 Serializable
接口,该类的对象就是可序列化的:
创建一个 ObjectOutputStream
调用 ObjectOutputStream
对象的 writeObject(对象)
方法输出可序列化对象。注意写出一次,操作 flush()
反序列化
创建一个 ObjectInputStream
调用 readObject()
方法读取流中的对象
RandomAccessFile 类
RandomAccessFile 类支持“随机访问”方式,程序可以直接跳到文件的任意位置来读、写文件
支持只访问文件的部分内容
可以向已存在的文件后追加内容
RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。
RandomAccessFile 类对象可以自由移动记录指针:
long getFilePointer()
:获取文件记录指针的当前位置
void seek(long pos)
: 将文件记录指针定位到pos 位置
构造器
public RandomAccessFile(File file, String mode)
public RandomAccessFile(String name, String mode)
创建 RandomAccessFile 类实例需要指定一个 mode
参数,该参数指定 RandomAccessFile 的访问模式:
r: 以只读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入;同步文件内容的更新
rws:打开以便读取和写入;同步文件内容和元数据的更新
- 本文作者: Kelly Liu
- 本文链接: http://tiantianliu2018.github.io/2019/10/16/Java-IO流/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!