Java之InputStream实战指南:轻松读取、操作文件流

哈喽,各位小伙伴们,你们好,我是喵手。

今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,才能成长的更快,对吧。

我是一名Java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

Java是一门非常流行的编程语言,广泛应用于各种应用程序的开发。在Java中,输入输出是非常重要的基础功能。其中,InputStream是Java中的一个重要输入流类,用于从输入源读取数据。

摘要

本文将介绍InputStream类的源代码解析、应用场景案例、优缺点分析、类代码方法介绍以及测试用例。

InputStream类

简介

InputStream是Java中的一个抽象类,用于从输入源读取数据。它提供了以下基本方法:

  • int read():从输入流中读取一个字节的数据。如果已经到达输入流的末尾,则返回-1。
  • int read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。返回实际读取的字节数。
  • int read(byte[] b, int off, int len):从输入流中读取最多len个字节,并将其存储在缓冲区数组b中,从偏移量off开始存储。返回实际读取的字节数。
  • long skip(long n):从输入流中跳过并丢弃n个字节的数据,并返回实际跳过的字节数。
  • int available():返回可从输入流中读取的估计字节数。
  • void close():关闭输入流并释放与之相关的任何系统资源。

InputStream类是一个抽象类,不能直接实例化。它有几个具体的子类,如FileInputStream、ByteArrayInputStream、PipedInputStream等。这些子类提供了实际的方法来从特定类型的输入源中读取数据。

源代码解析

InputStream类的源代码可以在JDK中找到。以下是该类的部分源代码:

java 复制代码
public abstract class InputStream implements Closeable {
    // ...
    
    public abstract int read() throws IOException;
    
    public int read(byte[] b) throws IOException {
        return read(b, 0, b.length);
    }
    
    public int read(byte[] b, int off, int len) throws IOException {
        if (b == null) {
            throw new NullPointerException();
        } else if (off < 0 || len < 0 || len > b.length - off) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return 0;
        }
        int c = read();
        if (c == -1) {
            return -1;
        }
        b[off] = (byte) c;
        int i = 1;
        try {
            for (; i < len ; i++) {
                c = read();
                if (c == -1) {
                    break;
                }
                b[off + i] = (byte) c;
            }
        } catch (IOException ee) {
        }
        return i;
    }
    
    // ...
}

从上述代码中可以看出,InputStream类定义了一个抽象方法read(),用于从输入流中读取一个字节的数据。它还定义了重载的read()方法,用于从输入流中读取一定数量的字节,并将其存储在缓冲区数组中。

在read(byte[] b, int off, int len)方法中,该方法首先检查参数是否合法。然后,它从输入流中读取第一个字节,并将其存储在缓冲区数组的偏移量off位置。接下来,该方法从输入流中读取len-1个字节,并将它们存储在缓冲区数组中。最后,该方法返回实际读取的字节数。

应用场景案例

InputStream类的应用场景非常广泛。以下是一些典型的应用场景:

  1. 从文件中读取数据。可以使用FileInputStream类来创建一个输入流,然后从该流中读取数据。
  2. 从网络中读取数据。可以使用Socket类来创建一个连接,然后从该连接的输入流中读取数据。
  3. 从数据库中读取数据。可以使用JDBC API来执行查询操作,并从查询结果集的输入流中读取数据。
  4. 从字节数组中读取数据。可以使用ByteArrayInputStream类来创建一个输入流,然后从该流中读取数据。
  5. 从管道中读取数据。可以使用PipedInputStream类来创建一个输入流,然后从该流中读取数据。

优缺点分析

InputStream类的主要优点是它提供了一套抽象的、统一的输入流API,使得从不同类型的输入源中读取数据变得非常容易。

该类的主要缺点是它是一个抽象类,不能直接实例化。而且,它的具体子类需要提供实际的方法来从特定类型的输入源中读取数据。这使得InputStream类的使用略微有些复杂。

此外,如果从输入源读取的数据量很大,InputStream类可能会导致内存占用和性能问题。

类代码方法介绍

InputStream类定义了许多方法,以下是其中一些方法的介绍:

  • int read():从输入流中读取一个字节的数据。如果已经到达输入流的末尾,则返回-1。
  • int read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。返回实际读取的字节数。
  • int read(byte[] b, int off, int len):从输入流中读取最多len个字节,并将其存储在缓冲区数组b中,从偏移量off开始存储。返回实际读取的字节数。
  • long skip(long n):从输入流中跳过并丢弃n个字节的数据,并返回实际跳过的字节数。
  • int available():返回可从输入流中读取的估计字节数。
  • void close():关闭输入流并释放与之相关的任何系统资源。

测试用例

以下是一个简单的测试用例,用于从文件中读取数据:

java 复制代码
package com.example.javase.io.fileProject;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @Author 喵手
 * @Date 2023-10-18 22:32
 */
public class InputStreamTest {

    public static void testInputStream_1() throws IOException {
        InputStream in = new FileInputStream("testDoc.txt");
        byte[] buffer = new byte[1024];
        int length = in.read(buffer);
        while (length != -1) {
            System.out.write(buffer, 0, length);
            length = in.read(buffer);
        }
        in.close();
    }

    public static void main(String[] args) throws IOException {
        testInputStream_1();
    }
}

以上代码将打开一个名为testDoc.txt的文件,从中读取数据,并将其输出到控制台。

如下是上述案例执行结果:

全文小结

InputStream是Java中的一个重要输入流类,用于从输入源读取数据。它提供了一套抽象的、统一的输入流API,使得从不同类型的输入源中读取数据变得非常容易。

本文介绍了InputStream类的源代码解析、应用场景案例、优缺点分析、类代码方法介绍以及测试用例。希望读者可以通过本文深入了解InputStream类的相关知识,并在实际开发中熟练应用。

总结

本文对Java中的InputStream类进行了详细介绍。InputStream类是Java中的一个抽象类,用于从输入源读取数据。它提供了一套抽象的、统一的输入流API,使得从不同类型的输入源中读取数据变得非常容易。该类的具体子类需要提供实际的方法来从特定类型的输入源中读取数据。

在本文中,我们首先对InputStream类的源代码进行了解析,重点介绍了read()和read(byte[] b, int off, int len)方法的实现。接着我们介绍了InputStream的应用场景,包括从文件、网络、数据库、字节数组和管道中读取数据等。我们还分析了该类的优缺点,指出它的主要优点是提供了统一的输入流API,而缺点在于使用略微有些复杂,且可能导致内存占用和性能问题。

最后呢,我们给出了一个简单的测试用例,用于从文件中读取数据,并将其输出到控制台。总之,本文对InputStream类进行了全面深入的介绍,相信读者可以从中受益,以辅助大家能够更快的入手IO流。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

相关推荐
唐叔在学习3 分钟前
【唐叔学算法】第19天:交换排序-冒泡排序与快速排序的深度解析及Java实现
java·算法·排序算法
music0ant7 分钟前
Idea 配置环境 更改Maven设置
java·maven·intellij-idea
任小永的博客12 分钟前
VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)
后端·python·django
凡人的AI工具箱14 分钟前
每天40分玩转Django:Django类视图
数据库·人工智能·后端·python·django·sqlite
记得开心一点嘛22 分钟前
Nginx与Tomcat之间的关系
java·nginx·tomcat
凡人的AI工具箱24 分钟前
每天40分玩转Django:实操图片分享社区
数据库·人工智能·后端·python·django
界面开发小八哥35 分钟前
「Java EE开发指南」如何用MyEclipse构建一个Web项目?(一)
java·前端·ide·java-ee·myeclipse
王伯爵37 分钟前
<packaging>jar</packaging>和<packaging>pom</packaging>的区别
java·pycharm·jar
Q_19284999061 小时前
基于Spring Boot的个人健康管理系统
java·spring boot·后端
liutaiyi81 小时前
Redis可视化工具 RDM mac安装使用
redis·后端·macos