2 Java IO:InputStream 和 OutputStream

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又言又语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值