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

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是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中找到。以下是该类的部分源代码:

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():关闭输入流并释放与之相关的任何系统资源。

测试用例

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

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


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

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

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

  • 38
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值