Java InputStream实战之轻松读取操作文件流

 更新时间:2023年10月19日 11:08:13   作者:喵手  
在Java中,输入输出是非常重要的基础功能,其中,InputStream是Java中的一个重要输入流类,用于从输入源读取数据,下面我们就来学习一下InputStream类的相关知识吧

前言

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类的应用场景非常广泛。以下是一些典型的应用场景:

  • 从文件中读取数据。可以使用FileInputStream类来创建一个输入流,然后从该流中读取数据。
  • 从网络中读取数据。可以使用Socket类来创建一个连接,然后从该连接的输入流中读取数据。
  • 从数据库中读取数据。可以使用JDBC API来执行查询操作,并从查询结果集的输入流中读取数据。
  • 从字节数组中读取数据。可以使用ByteArrayInputStream类来创建一个输入流,然后从该流中读取数据。
  • 从管道中读取数据。可以使用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,而缺点在于使用略微有些复杂,且可能导致内存占用和性能问题。

到此这篇关于Java InputStream实战之轻松读取操作文件流的文章就介绍到这了,更多相关Java InputStream内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 泛型总结及详解

    Java 泛型总结及详解

    这篇文章主要介绍了Java 泛型的相关资料,并附简单实例代码,需要的朋友可以参考下
    2016-09-09
  • 动态修改spring aop 切面信息提升自动日志输出框架效率

    动态修改spring aop 切面信息提升自动日志输出框架效率

    这篇文章主要为大家介绍了动态修改spring aop切面信息提升自动日志输出框架效率,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • IDEA运行Tomcat中文乱码出现的各种问题

    IDEA运行Tomcat中文乱码出现的各种问题

    这篇文章主要介绍了IDEA运行Tomcat中文乱码的各种问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • SpringBoot 回滚操作的几种实现方式

    SpringBoot 回滚操作的几种实现方式

    回滚操作是一种常见的操作,用于撤销之前执行的操作,本文主要介绍了SpringBoot回滚操作的几种实现方式,包含基于异常类型的回滚、基于自定义逻辑的回滚和基于数据库状态的回滚,感兴趣的可以了解一下
    2024-03-03
  • PowerJob的OmsLogHandler工作流程源码解析

    PowerJob的OmsLogHandler工作流程源码解析

    这篇文章主要为大家介绍了PowerJob的OmsLogHandler工作流程源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Spring定时任务轮询本地数据库实现过程解析

    Spring定时任务轮询本地数据库实现过程解析

    这篇文章主要介绍了Spring定时任务轮询本地数据库实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 基于Java实现图片相似度对比的示例代码

    基于Java实现图片相似度对比的示例代码

    很多时候我们需要将两个图片进行对比,确定两个图片的相似度。本文将利用Java和OpenCV库实现图片相似度对比,感兴趣的可以动手尝试一下
    2022-07-07
  • Java中的WeakHashMap概念原理以及简单案例

    Java中的WeakHashMap概念原理以及简单案例

    这篇文章主要介绍了Java中的WeakHashMap概念原理以及简单案例,WeakHashMap使用了软引用结构,它的对象在垃圾回收时会被删除,垃圾回收是优先级非常低的线程,不能被显示调用,当内存不足的时候会启用,需要的朋友可以参考下
    2023-09-09
  • Java检查非空的三种方法总结

    Java检查非空的三种方法总结

    这篇文章主要介绍了Java检查非空的三种方法总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java程序执行的全流程

    Java程序执行的全流程

    这篇文章主要介绍了Java程序执行的全流程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论