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 !!!


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

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

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

相关推荐
paopaokaka_luck2 分钟前
智能推荐社交分享小程序(websocket即时通讯、协同过滤算法、时间衰减因子模型、热度得分算法)
数据库·vue.js·spring boot·后端·websocket·小程序
留不住丨晚霞10 分钟前
说说SpringBoot常用的注解?
java·开发语言
华科云商xiao徐16 分钟前
Java多线程爬虫动态线程管理实现
java·爬虫·数据挖掘
程序员NEO17 分钟前
Spring AI 对话记忆大揭秘:服务器重启,聊天记录不再丢失!
人工智能·后端
用户214118326360218 分钟前
惊爆!国内轻松白嫖 Claude Code,编程效率狂飙
后端
iccb101323 分钟前
我是如何实现在线客服系统的极致稳定性与安全性的
前端·javascript·后端
柒七爱吃麻辣烫25 分钟前
八股文系列-----SpringBoot自动配置的流程
java·spring boot·rpc
M1A129 分钟前
Java 面试系列第一弹:基础问题大盘点
java·后端·mysql
发仔12330 分钟前
Dubbo介绍及示例用法
java·dubbo
goxingman38 分钟前
关于使用idea打包的时候报错,Maven提示乱码java: �Ҳ�������
java·maven·intellij-idea