> InputStream字节输入流
OutputStream字节输出流
用于以字节的形式读取和写入数据
# ASCII码 概念
所有的数据存放在计算机中都是以数字的形式存放的。 所以字母就需要转换为数字才能够存放。
比如A就对应的数字65,a对应的数字97. 不同的字母和符号对应不同的数字,就是一张码表。
ASCII是这样的一种码表。 只包含简单的英文字母,符号,数字等等。 不包含中文,德文,俄语等复杂的。
![](https://box.kancloud.cn/13ac6e883e2bee9adb2bf04320701441_1155x815.jpg)
# 以字节流的形式读取文件内容
InputStream是字节输入流,同时也是抽象类,只提供方法声明,不提供方法的具体实现。
FileInputStream 是InputStream子类,以FileInputStream 为例进行文件读取
```
package com.dodoke.util;
import java.io.File;
import java.io.FileInputStream;
public class TestSteam3 {
public static void main(String[] args) {
try {
// 准备文件lol.txt其中的内容是AB,对应的ASCII分别是65 66
File f = new File("d:/log.txt");
// 创建基于文件的输入流
FileInputStream fis = new FileInputStream(f);
// 创建字节数组,其长度就是文件的长度
byte[] all = new byte[(int) f.length()];
// 以字节流的形式读取文件的所有内容
fis.read(all);
for (byte b : all) {
System.out.println(b);
}
// 每次使用完流,都应该进行关闭
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
# 以字节流的形式向文件写入数据
OutputStream是字节输出流,同时也是抽象类,只提供方法声明,不提供方法的具体实现。
FileOutputStream 是OutputStream子类,以FileOutputStream 为例向文件写出数据
注: 如果文件d:/lol2.txt不存在,写出操作会自动创建该文件。
但是如果是文件 d:/xyz/lol2.txt,而目录xyz又不存在,会抛出异常
```
package com.dodoke.util;
import java.io.File;
import java.io.FileOutputStream;
public class TestSteam4 {
public static void main(String[] args) {
try {
// 准备文件lol2.txt其中内容是空的
File f = new File("d:/log2.txt");
// 准备长度是2的字节数组,用88,89初始化,其对应的字符分别是X,Y
byte data[] = { 88, 89 };
// 创建基于文件的输出流
FileOutputStream fos = new FileOutputStream(f);
fos.write(data);
// 每次使用完流,都应该进行关闭
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
# 练习-写入数据到文件
以字节流的形式向文件写入数据 中的例子,当lol2.txt不存在的时候,是会自动创建lol2.txt文件的。
但是,如果是写入数据到d:/xyz/lol2.txt,而目录xyz又不存在的话,就会抛出异常。
那么怎么自动创建xyz目录?
如果是多层目录 d:/xyz/abc/def/lol2.txt 呢?
```
package com.dodoke.util;
import java.io.File;
import java.io.FileOutputStream;
public class TestSteam4 {
public static void main(String[] args) {
try {
File f = new File("d:/xyz/abc/def/log2.txt");
// 因为默认情况下,文件系统中不存在 d:\xyz\abc\def,所以输出会失败
// 首先获取文件所在的目录
File dir = f.getParentFile();
if (!dir.exists()) {
// dir.mkdir(); //使用mkdir会抛出异常,因为该目录的父目录也不存在
dir.mkdirs();//使用mkdirs则会把不存在的目录都创建好
}
// 准备长度是2的字节数组,用88,89初始化,其对应的字符分别是X,Y
byte data[] = { 88, 89 };
// 创建基于文件的输出流
FileOutputStream fos = new FileOutputStream(f);
fos.write(data);
// 每次使用完流,都应该进行关闭
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```