ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

InputStream 和 OutputStream 基础

2021-09-19 23:35:25  阅读:159  来源: 互联网

标签:OutputStream 字节 read 基础 InputStream write new input out


大家好,我是指北君。

在 java 中将程序通常会和其他外部设备进行数据交互,比如写入磁盘,网络发送数据等等,今天我们来学学 java 中 基础的 IO 流。

IO 流

与其他外部设备进行数据交互,比如将数据从内存中保存到磁盘文件中或者从网络上下载数据并加载到内存中,这个过程都是一种单向且有顺序的数据传输,被称之为流。

IO 就是 Input 输入和 Output 输出。输入输出以内存为中心的流向划分的。传输数据到内存就是输入流,从内存中输出数据就是输出流。

InputStream

InputStream 是所有输入流的父类,是一个抽象类,读取的数据单位是字节(byte)。

主要的抽象方法是 read(),这个方法就是读取数据内容并返回 -1~255 的 int 值。read() 方法是一个阻塞的方法,只有将内容全部读取完成之后才能运行下一行代码。

public abstract int read() throws IOException;

以 FileInputStream 实现类作为示例:

public static void main(String[] args) throws Exception {
    // input.txt 内容为 hello, inputStream
    InputStream input = new FileInputStream("input.txt");
    int n = 0;
    while((n = input.read()) != -1){
        System.out.print((char) n);
    }
    input.close();
}

示例中的 read() 方法只能一个字节的一个字节读取数据,效率不高,当文件中存在多个字节为一个汉字的中文时,上面的示例将打印出乱码。

InputStream 支持将一次性读取多个字节到缓冲区,利用缓冲区提高效率。返回值的数据不再是读取的数据字节,而是读取的字节数。并且可以正常的打印出中文字符。

// 将读取的内容填充到 byte 数组
public int read(byte b[]) throws IOException
// 将读取的内容填充 byte 数组中 off 开始,len 长度的区域
public int read(byte b[], int off, int len)  throws IOException

将缓冲区大小设置为 1024 个字节示例:

 public static void main(String[] args) throws Exception {
    //input.txt 文件内容为 你好, inputStream
    InputStream input = new FileInputStream("input.txt");

    byte[] result = new byte[1024];

    while(input.read(result) != -1){
        System.out.print(new String(result, "utf-8"));
    }
    input.close();
}

OutputStream

OutputStream 是所有输出流的父类。和 InputStream 一样是一个抽象类。

主要的抽象方法是 write(),也是一个阻塞的方法,只有将内容全部写完成之后才能运行下一行代码。write() 方法和 read() 方法一样都是一个字节一个字节的操作的。

public abstract void write(int b) throws IOException;

以 FileInputStream 实现类作为示例:

public static void main(String[] args) throws Exception {
    OutputStream out = new FileOutputStream("out.txt");
    try {
        out.write("h".getBytes());
        out.write("e".getBytes());
        out.write("l".getBytes());
        out.write("l".getBytes());
        out.write("0".getBytes());
    } finally {
        if(out != null) {
            out.close();
        }
    }
}

write() 按单个字节写入磁盘的效率比较低下,OutputStream 提供了 write(byte[]) 一次性大批量的将字节输出到磁盘。对于 IO 设备来说,一次性写入 1 个字节和写入 1000 个字节的时间都是差不多的。

public static void main(String[] args) throws Exception {
    OutputStream out = new FileOutputStream("out.txt");
    try {
        out.write("哈喽,outputStream".getBytes());
    } finally {
        if(out != null) {
            out.close();
        }
    }
}

关闭资源

不管是 InputStream 还是 OutputStream 在使用资源之后都需要调用 close()方法。在示例中如果在 close() 方法调用之前抛出异常则不会自动关闭资源。以下两种方式都可以关闭资源:

  1. try..finally 方式
public static void main(String[] args) throws Exception {
    InputStream input = new FileInputStream("input.txt");
    try {
        byte[] result = new byte[1024];

        while(input.read(result) != -1){
            System.out.print(new String(result, "utf-8"));
        }
    } finally {
        if(input != null) {
            input.close();
        }
    }

}
  1. try(resource)

实现了 Closeable 接口的 InputStream 和 OutputStream 使用 try(resource) 时,编译器会自动增加 finally。

public static void main(String[] args) throws Exception {
    try (OutputStream out = new FileOutputStream("out.txt")){
        out.write("编译器会添加 finally".getBytes());
    }

}

总结

今天就是简单地给大家介绍 Java 的 IO 流,为接下来学其他 IO 类打个基础。

标签:OutputStream,字节,read,基础,InputStream,write,new,input,out
来源: https://www.cnblogs.com/javatechnorth/p/15313168.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有