Java 基础(十二) 流
1. 流的基础类
- InputStream
- OutputStream
所有的输入、输出都基于这两个类. 这两个类的操作很有限, 都是字节( byte )层面的读写.
注: Java 中 char 为两个字节 ( \u0000~\uFFFF ), byte 为一个字节 (-128 ~ 127).
1 | package hello; |
1 | //输入 |
1 | //输出 |
2. 文件流
- FileInputStream
- FileOutputStream
这两个类可以对文件进行字节层面上的二进制输入输出
1 | public static void main(String[] args) { |
1 | //打开 a.bat |
3. 流过滤器
FileInputStream 和 FileOutputStream只能实现字节的读写, 如果需要写(读)入基本类型的数据, 就需要用到流过滤器.
写(读)如基本数据类型 DataOutputStream ( DataInputStream ) , 这两者是二进制写(读)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15DataOutputStream out =
new DataOutputStream(
//使用缓冲, 避免频繁对硬盘读写
new BufferedOutputStream(
new FileOutputStream("a.bat")));
//可以写入 int
out.write(123);
DataInputStream in =
new DataInputStream(
//使用缓冲, 避免频繁对硬盘读写
new BufferedInputStream(
new FileInputStream("a.bat")));
//可以读入 int
int j = in.readInt();
out.close();
4. 文本数据 Reader/Writer
若文件是 Unicode 编码的, 可以直接用 Reader/Writer 打开读写, 但是实际情况下并不是所有的文件都是 Unicode ,所以需要借助 Stream 打开文件, 以过滤器的方式输入输出.
1 | //写入字符 |
InputStreamReader 和 OutputStreamWriter起到了桥梁的作用, 将字符流和字节流建立了联系. 在他们的构造器中可以添加第二个参数以指定编码方式(如 utf-8 )
有更加方便的文件读写: FileReader 和 FileWriter, 但很少用. 使用如下:
1 | //读 |
除了以上读取的方式, 当然也可以用 Scanner, 在 InputStream 或者 Reader 的基础上建立一个 Scanner 对象, 就可以从流中的文本解析出各种基本类型.
Stream/Reader/Scanner 的选择
5. 对象序列化
1. 步骤
- 创建 FileOutputStream
- 创建 ObjectOutputStream
- 写入对象
- 关闭 ObjectOutputStream
1 | ObjectOutputSream os = new ObjectOutputSream(new FileOutputStream()); |
2.注意事项
- 如果想要让类能够序列化, 要实现 Serializable 接口 ( 只声明即可 )
- 如果对象的,某个祖先类不可序列化, 那么这个不可序列化的类以及它的子孙的构造函数将会执行, 全部回归初始状态
- 静态变量不会被序列化, 而是一直维持原来状态
- 使用 transient 关键字来阻止某个变量被序列化, 还原时会自动被赋值为默认值
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 极东魔术昼寝结社!
评论