1 java.io.InputStream
InputStream 是所有字节输入流的基类,用于读取基于字节的数据。
InputStream 是 abstract
类,不能实例化。
常用方法有:
(1) int available()
返回一个预估的可以从输入流中读取的字节数。
测试:准备 2 个 .txt
文件,一个存放英文字符,一个存放中文字符
【test.txt】内容
Good news!
【测试.txt】内容
好消息!
单元测试:
@Test
public void test() throws IOException {
try (InputStream inputStream = new FileInputStream("D:/test.txt")) {
System.out.println(inputStream.available());
}
try (InputStream inputStream = new FileInputStream("D:/测试.txt")) {
System.out.println(inputStream.available());
}
}
测试结果:
10
12
【test.txt】中加上空格一共 10 个英文字符,每个字符占一个字节,所以预估的可读取字节数为 10。
【测试.txt】中共有 4 个中文字符,因为文件编码是 UTF-8,所以预估的可读取字节数为 12(4*3),参看 常见编码占用字节数
(2) void close()
关闭输入流并释放与此输入流关联的系统资源。
(3) abstract int read()
从输入流中读取一个字节的数据,返回值是一个介于 0 至 255 间的整形数值。
单元测试:
@Test
public void test() throws IOException {
try (InputStream inputStream = new FileInputStream("D:/test.txt")) {
int data = inputStream.read();
while (data != -1) {
String binary = Integer.toBinaryString(data);
if (binary.length() < 8) {
int size = 8 - binary.length();
StringBuilder prefix = new StringBuilder();
for (int i = 0; i < size; i++) {
prefix.append("0");
}
binary = prefix + binary;
}
System.out.print("二进制:" + binary);
System.out.print(" ");
System.out.print("十进制:" + data);
System.out.print(" ");
System.out.print("字符:" + (char) data);
System.out.println();
data = inputStream.read();
}
}
}
测试结果:
二进制:01000111 十进制:71 字符:G
二进制:01101111 十进制:111 字符:o
二进制:01101111 十进制:111 字符:o
二进制:01100100 十进制:100 字符:d
二进制:00100000 十进制:32 字符:
二进制:01101110 十进制:110 字符:n
二进制:01100101 十进制:101 字符:e
二进制:01110111 十进制:119 字符:w
二进制:01110011 十进制:115 字符:s
二进制:00100001 十进制:33 字符:!
(4) int read(byte[] b)
尝试从输入流中读取与参数字节数组容量一致的字节数,并将此读取内容存入缓存数组(b),返回值为实际读取的字节数。
单元测试:
@Test
public void test() throws IOException {
try (InputStream inputStream = new FileInputStream("D:/test.txt")) {
byte[] buf = new byte[5];
int data = inputStream.read(buf);
while (data != -1) {
System.out.println(new String(buf));
data = inputStream.read(buf);
}
}
}
测试结果:
Good
news!
可以看出一共只读取了 2 次就读取完了所有输入流中的内容,一次性读取一个字节数组的方式比一次性读取一个字节的方式快。
(5) int read(byte[] b, int off, int len)
尝试从输入流中指定的位置(off)开始读取指定长度(len)的字节数,并将读取内容存入缓存数组(b),返回值为实际读取的字节数。
2 java.io.OutputStream
OutputStream 是所有字节输出流的基类,是 abstract
类,不能实例化。
常用方法有:
(1) void close()
关闭输出流并释放与此输出流关联的系统资源。
(2) void flush()
刷新此输出流并强制将缓存的输出字节写入目标媒介。
单元测试:
@Test
public void test() throws IOException {
String[] content = new String[] {"Msg", " ", "received", "!"};
try (OutputStream outputStream = new FileOutputStream("D:/test.txt")) {
for (String item : content) {
outputStream.write(item.getBytes());
outputStream.flush();
System.out.println(1 / 0);
}
}
}
测试结果:
运行测试过程中输入流成功写入一次后便异常终止,运行测试后生成【test.txt】文件,内容如下:
Msg
(3) void write(byte[] b)
将指定的字节数组中所有数据写入到输出流。
单元测试:
@Test
public void test() throws IOException {
String[] content = new String[] {"Msg", " ", "received", "!"};
try (OutputStream outputStream = new FileOutputStream("D:/test.txt")) {
for (String item : content) {
outputStream.write(item.getBytes());
}
}
}
测试结果:
之前D盘中无【test.txt】文件,运行测试后生成此文件且内容如下:
Msg received!
(4) void write(byte[] b, int off, int len)
将字节数据中从 off
位置开始,len
个字节的数据写入到输出流。
(5) abstract void write(int b)
将指定的字节写入此输出流。