2 Java IO:InputStream 和 OutputStream

来源:互联网 发布:fastjson解析json数据 编辑:程序博客网 时间:2024/05/18 00:29

1 java.io.InputStream

InputStream 是所有字节输入流的基类,用于读取基于字节的数据。

InputStream 是 abstract 类,不能实例化。

常用方法有:

(1) int available()
返回一个预估的可以从输入流中读取的字节数。

测试:准备 2 个 .txt 文件,一个存放英文字符,一个存放中文字符

【test.txt】内容

Good news!

【测试.txt】内容

好消息!

单元测试:

@Testpublic 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());    }}

测试结果:

1012

【test.txt】中加上空格一共 10 个英文字符,每个字符占一个字节,所以预估的可读取字节数为 10。
【测试.txt】中共有 4 个中文字符,因为文件编码是 UTF-8,所以预估的可读取字节数为 12(4*3),参看 常见编码占用字节数

(2) void close()
关闭输入流并释放与此输入流关联的系统资源。

(3) abstract int read()
从输入流中读取一个字节的数据,返回值是一个介于 0 至 255 间的整形数值。

单元测试:

@Testpublic 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),返回值为实际读取的字节数。

单元测试:

@Testpublic 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()
刷新此输出流并强制将缓存的输出字节写入目标媒介。

单元测试:

@Testpublic 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)
将指定的字节数组中所有数据写入到输出流。

单元测试:

@Testpublic 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)
将指定的字节写入此输出流。

原创粉丝点击