IO流 - InputStream 和 OutputStream的基本用法

上一篇博客已经给大家介绍过什么是IO流,其中也提到了关于IO流的分类   点击链接查看博客-------->  什么是IO流

这篇博客主要了解关于Java标准库提供的最基本的输入输出流:   InputStream 、 OutputStream

一、InputStream:

                       是Java提供的最基本的输入流,这个并不是一个接口而是一个抽象类

                       这个类中最重要的方法就是 int read() : 读取输入流的下一个字节,并且返回字节表示的int值,返回-1表示到末尾不能继续读取了

😎  InputStream的基本用法:

1.//读取一个字节并以整数的形式返回(0~255),如果返回-1说明已经到输入流的末尾无法继续读取

int read() throws IOException

2.读取一系列字节,并存储到一个数组buffer中, 返回实际读取的字节数,如果读取前已经到输入流的末尾返回-1

int read(byte[] buffer) throws IOException

3.读取length个字节,并存储到一个字节数组buffer,从length位置开始,返回实际读取的字节数

int read(byte[] buffer,int offset, int length) throws IOException

4.关闭流释放内存资源

void close() throws IOException

 😎 inputStream中最常用的一个子类:   FileInputStream 

顾名思义FileInputStream就是从文件流中读取数据,我们通过一个例子来延时如何完整的读取一个File的所有字节

public void readFile() throws IOException {
    //创建一个FileInputStream 对象
    InputStream input = new FileInputStream("src/readme.txt");
    for(;;){
        int n=input.read();//反复调用read()方法,直到返回-1 
        if(n == -1){
        break;
        }
        System.out.println(n);//打印byte的值
        }
        input.close()//关闭流
 
    }

//修改后的写法:因为上面的方法当出现异常的时候无法执行close

public void readFile() throws IOException {
    InputStream input = null;
    try {
        input = new FileInputStream("src/readme.txt");
        int n;
        while ((n = input.read()) != -1) { // 利用while同时读取并判断
            System.out.println(n);
        }
    } finally {
        if (input != null) { input.close(); }
    }
}

通过例子我们发现最后使用了 input.close 来关闭流,为什么要关闭流?

应用程序在运行的过程中,如果打开了一个文件进行读写,完成后要及时地关闭,以便让操作系统把资源释放掉,否则,应用程序占用的资源会越来越多,不但白白占用内存,还会影响其他应用程序的运行。

😎 缓冲区:

我们上面读取流的时候,每次只能读取一个字节,这样的效率很低。

我们可以利用InputStream提供的两个重载方法来支持读取多个字节

int read(byte[] b);  //读取若干字节并填充到byte[]数组,返回读取的字节数
int read(byte[] b, int off, int len); //指定byte[] 数组的偏移量 和最大填充数

例子:

public void readFile() throws IOException {
    try (InputStream input = new FileInputStream("src/readme.txt")) {
        // 定义1000个字节大小的缓冲区:
        byte[] buffer = new byte[1000];
        int n;
        while ((n = input.read(buffer)) != -1) { // 读取到缓冲区
            System.out.println("read " + n + " bytes.");
        }
    }
}

二、OutputStream 输出流

🍁 OutputStream的重要方法:

public abstract void write(int b) throws IOException

局限性: 这个方法会写入一个字节到输入流。

对于close的用法 OutputStream和InputStream的用法一样

特别注意:OutputStream提供了一个flush()方法,目的是将缓冲区的内容真正的输出到目的地

其中OutputStream中的子类 FileOutputStream 

🍁FileOutputStream的基本用法:

FileOutputStream的例子:将若干字节写入文件流

public void writeFile() throws IOException{
    OutputStream output = new FileOutputStream("out/readme.txt");
    output.write(72); //H
    output.write(101);//e
    output.write(108);//I
    output.close();
}

但是每次只能写入一个字节,太麻烦了,我们有一个好的重载方法

void Write(byte[]) ;

public void writeFile() throws IOException {
    try (OutputStream output = new FileOutputStream("out/readme.txt")) {
        output.write("Hello".getBytes("UTF-8")); // Hello
    } // 编译器在此自动为我们写入finally并调用close()
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值