Java中的字节流InputStream和OutputStream详解

 更新时间:2023年10月26日 08:53:22   作者:CodeJiao  
这篇文章主要介绍了Java中的字节流InputStream和OutputStream详解,继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节8bit,我们看到的具体的某一些管道,凡是以InputStream结尾的管道,都是以字节的形式向我们的程序输入数据,需要的朋友可以参考下

1. InputStream(字节输入流)

  • 我们看到的具体的某一些管道,凡是以InputStream结尾的管道,都是以字节的形式向我们的程序输入数据。
  • 继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(Byte)=> (8bit);下图中深色为节点流,浅色为处理流。

在这里插入图片描述

InputStream的基本方法

        //读取一个字节并以整数的形式返回(0~255)
        // 如果返回-1就说明已经到了输入流的末尾
        int read () throws IOException

        //读取一系列字节并存储到一个数组buffer
        // 返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1
        int read ( byte[] buffer) throws IOException

        //从offset位置开始,读取length个字节,并存储到一个字节数组buffer,
        // 返回实际读取的字节数,如果读取前以到输入流的末尾返回-1.
        int read ( byte[] buffer, int offset, int length) throws IOException

        //关闭流释放内存资源
        void close () throws IOException

        //跳过n个字节不读,返回实际跳过的字节数
        long skip(long n) throws IOException

read()方法是一个字节一个字节地往外读,每读取一个字节,就处理一个字节。read(byte[] buffer)方法读取数据时,先把读取到的数据填满这个byte[]类型的数组buffer(buffer是内存里面的一块缓冲区),然后再处理数组里面的数据。这就跟我们取水一样,先用一个桶去接,等桶接满水后再处理桶里面的水。如果是每读取一个字节就处理一个字节,这样子读取也太累了。

【演示:使用FileInputStream流来读取FileInputStream.java文件的内容】

read.txt

在这里插入图片描述

在这里插入图片描述

Test.java

package character1;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class Test {
    public static void main(String[] args) {
        // 使用变量b来装调用read()方法时返回的整数
        int b = 0;
        /*
        使用FileInputStream流来读取有中文的内容时,读出来的是乱码,
        因为使用 InputStream流里面的read()方法读取内容时是一个字节一个字节地读取的,
        而一个汉字是占用两个 字节的,所以读取出来的汉字无法正确显示。

        使用FileReader流来读取内容时,中英文都可以正确显示,
        因为Reader流里面的 read()方法是一个字符一个字符地读取的,
        这样每次读取出来的都是一个完整的汉字,这样就可以正确 显示了。
         */
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\read.txt");
        } catch (FileNotFoundException e) {
            System.out.println("系统找不到指定的文件");
            System.exit(-1);// 系统非正常退出
        }

        long num = 0; //  使用变量num来记录读取到的字符数

        // 调用read()方法时会抛异常,所以需要捕获异常
        try {
            /*
            调用int read() throws Exception方法时,返回的是一个int类型的整数
            循环结束的条件就是返回一个值-1,表示此时已经读取到文件的末尾了。
             */
            while ((b = inputStream.read()) != -1) {
                // “char(b)”把使用数字(ASCII码)英文字母转换成字符输入
                System.out.print((char) b);
                num++;
            }
            inputStream.close();// 关闭输入流
            System.out.println("总共读取了" + num + "个字节的文件");
        } catch (IOException e) {
            System.out.println("文件读取错误");
            System.exit(-1);// 系统非正常退出
        }
    }
}

在这里插入图片描述

2. OutputStream(输出流)

继承自OutputStream的流是用于程序中输出数据,且数据的单位为字节(Byte)=> (8bit);下图中深色的为节点流,浅色为处理流。

在这里插入图片描述

OutputStream的基本方法:

在这里插入图片描述

案例: 【使用FileOutputStream流往一个文件里面写入数据】

在这里插入图片描述

Test.java

package character1;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class Test {
    public static void main(String[] args) throws IOException {
        // 使用变量b来装调用read()方法时返回的整数
        int b = 0;
        try (FileInputStream inputStream = new FileInputStream("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\read.txt");
             FileOutputStream outputStream = new FileOutputStream("\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\write.txt")) {
            while ((b = inputStream.read()) != -1) {
                outputStream.write(b);
            }
        } catch (IOException e) {
            System.out.println("读取文件异常");
            System.exit(-1);// 系统非正常退出
        }
        System.out.println("文件写入成功");
    }
}

在这里插入图片描述

write.txt

在这里插入图片描述

3. 小结

FileInputStream和FileOutputStream这两个流都是字节流,都是以一个字节为单位进行输入和输出的。

所以对于占用2个字节存储空间的字符来说读取出来时就会显示成乱码。

到此这篇关于Java中的字节流InputStream和OutputStream详解的文章就介绍到这了,更多相关Java的InputStream和OutputStream内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot上传文件过大的500异常解决

    springboot上传文件过大的500异常解决

    这篇文章主要介绍了springboot上传文件过大的500异常解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • idea如何解决commit代码时一直code Analyze加载的问题

    idea如何解决commit代码时一直code Analyze加载的问题

    文章介绍了解决Git提交代码时出现codeAnalyze加载卡顿问题的方法,即关闭IDEA中的相关设置选项,作者分享个人经验,希望对大家有所帮助,并鼓励支持脚本之家
    2025-01-01
  • java常用工具类 UUID、Map工具类

    java常用工具类 UUID、Map工具类

    这篇文章主要为大家详细介绍了Java常用工具类,包括UUID工具类、Map工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Java中常见的陷阱题及答案

    Java中常见的陷阱题及答案

    在电脑里找到一份当时学习JAVA时的笔记,看到一些现在已经遗忘的细节。稍微整理了几个,发出来与大家分享。这篇文章主要介绍了Java中常见的陷阱题及答案,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • 如何解决通过spring-boot-maven-plugin package失败问题

    如何解决通过spring-boot-maven-plugin package失败问题

    这篇文章主要介绍了如何解决通过spring-boot-maven-plugin package失败问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • redis与ssm整合方法(mybatis二级缓存)

    redis与ssm整合方法(mybatis二级缓存)

    本文给大家介绍redis与ssm整合方法(mybatis二级缓存)。主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存在就会新建缓存,所有的insert,update操作都会更新缓存
    2017-12-12
  • 利用Java实现word导入导出富文本(含图片)的详细代码

    利用Java实现word导入导出富文本(含图片)的详细代码

    这篇文章主要为大家详细介绍了利用Java实现word导入导出富文本(含图片),文中的示例代码讲解详细,对大家的学习或工作有一定的帮助,感兴趣的小伙伴可以学习一下
    2024-02-02
  • 对Java的面对对象编程中对象和引用以及内部类的理解

    对Java的面对对象编程中对象和引用以及内部类的理解

    这篇文章主要介绍了对Java的面对对象编程中对象和引用以及内部类的理解,需要的朋友可以参考下
    2016-01-01
  • Java超过long类型的数据表示方法

    Java超过long类型的数据表示方法

    这篇文章主要给大家介绍Java超过long类型的数据如何表示,在 Java 中,如果需要表示超过 long 类型范围的数据,可以使用 BigInteger 类,BigInteger 是 Java 提供的一个用于处理任意精度整数的类,它可以表示非常大或非常小的整数,需要的朋友可以参考下
    2023-09-09
  • Java ThreadLocal的使用详解

    Java ThreadLocal的使用详解

    ThreadLocal是线程私有的局部变量存储容器,可以理解成每个线程都有自己专属的存储容器,用来存储线程私有变量。ThreadLocal 在日常开发框架中应用广泛,但用不好也会出现各种问题,本文就此讲解一下。
    2021-05-05

最新评论