Java利用InputStream类实现文件读取与处理

 更新时间:2023年11月08日 08:35:19   作者:喵手  
在Java开发中,输入流(InputStream)是一个非常重要的概念,它涉及到文件读写、网络传输等多个方面,InputStream类是Java中输入流的抽象基类,定义了读取输入流数据的方法,本文将以InputStream类为切入点,介绍Java中的输入流概念及其应用,需要的朋友可以参考下

Java技术迷

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

我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

摘要

InputSteam类是Java中输入流的抽象基类。InputStream类及其子类可以从不同的输入源中读取数据,如文件、网络、字节数组等。InputStream类提供了多个读取数据的方法,可以读取字节、字符、数组等不同类型的数据。InputStream类的常用子类有FileInputStream、ByteArrayInputStream等。

本文将深入解析InputStream类的源代码实现,并结合实际应用场景进行案例说明。同时,我们还将分析InputStream类的优缺点,以及类方法的具体介绍和测试用例。

InputStream类

简介

InputStream类是Java中所有输入流的父类,它是一个抽象类。InputStream类提供了读取不同类型数据的方法,如read()、read(byte[] b)、read(byte[] b, int off, int len)等,这些方法可以读取字节、字符、数组等不同类型的数据。InputStream类的常用子类有FileInputStream、ByteArrayInputStream等。

下面是InputStream类的定义:

1
2
3
public abstract class InputStream implements Closeable {
    //...
}

InputStream类定义了一个Closeable接口,该接口表示此输入流已经完成输入操作,并且可以关闭此流。InputStream类的子类需要实现这个方法。

源代码解析

InputStream类是Java中所有输入流的父类,提供了读取不同类型数据的方法。在InputStream类中,最重要的方法是read()方法。

read()方法可以读取一个字节的数据,并返回该字节的值。它的定义如下:

1
public abstract int read() throws IOException;

该方法会从输入流中读取一个字节的数据,并将该字节的值返回。如果已经到达输入流的末尾,则返回-1。此方法可能会阻塞,直到输入数据可用、检测到文件结束或抛出异常为止。

在InputStream类中,还有另外两个重要的方法,分别是read(byte[] b)和read(byte[] b, int off, int len)。其中,read(byte[] b)方法可以一次读取多个字节的数据,并将读取的字节数据存储到指定的字节数组中,而read(byte[] b, int off, int len)方法则可以读取指定长度的字节数据,并存储到指定的字节数组中。

InputStream类还提供了mark(int readlimit)、reset()、available()等方法。其中,mark(int readlimit)方法允许输入流在某个位置设置一个标记,以便后续调用reset()方法时,输入流可以回到该标记处重新读取数据。而reset()方法可以将输入流指针重新设置到最近的标记处。available()方法可以返回当前可用的字节数。

如下是部分源码截图:

应用场景案例

在Java中,InputStream类及其子类可以从不同的输入源中读取数据,如文件、网络、字节数组等。下面是一个小例子,演示如何从文件中读取数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.io.FileInputStream;
import java.io.InputStream;
 
public class InputStreamTest {
    public static void main(String[] args) throws Exception {
        InputStream input = new FileInputStream("test.txt");
        int data = input.read();
        while(data != -1){
            System.out.println((char) data);
            data = input.read();
        }
        input.close();
    }
}

在上述代码中,我们首先通过FileInputStream类打开一个文件输入流,接着使用InputStream类中的read()方法读取文件数据,并将每个字节转化为字符输出。最后,我们需要记得关闭输入流,以释放资源。

除了文件输入流,我们还可以使用ByteArrayInputStream类从字节数组中读取数据。下面是一个示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.ByteArrayInputStream;
import java.io.InputStream;
 
public class ByteArrayInputStreamTest {
    public static void main(String[] args) throws Exception {
        byte[] data = "Hello World".getBytes();
        InputStream input = new ByteArrayInputStream(data);
        int ch = input.read();
        while(ch != -1){
            System.out.println((char) ch);
            ch = input.read();
        }
        input.close();
    }
}

在上述代码中,我们使用ByteArrayInputStream类从一个字节数组中读取数据,然后将每个字节转化为字符输出。最后需要记得关闭输入流。

优缺点分析

InputStream类的优点在于它是一个抽象类,提供了读取不同类型数据的方法,可以从不同输入源读取数据。此外,InputStream类提供了mark()、reset()等方法,使得输入流可以重复读取数据。

然而,InputStream类本身并不能直接使用,需要使用它的子类,如FileInputStream、ByteArrayInputStream等。这些子类需要根据不同的输入源进行实例化,使代码更加复杂。

类代码方法介绍

在InputStream类中,最常用的方法是read()、read(byte[] b)和read(byte[] b, int off, int len)方法。下面是它们的详细介绍:

  • read()方法:读取一个字节的数据,并返回该字节的值。如果已经到达输入流的末尾,则返回-1。此方法可能会阻塞,直到输入数据可用、检测到文件结束或抛出异常为止。
  • read(byte[] b)方法:一次读取多个字节的数据,并将读取的字节数据存储到指定的字节数组中。返回值为实际读取的字节数。如果已经到达输入流的末尾,则返回-1。
  • read(byte[] b, int off, int len)方法:读取指定长度的字节数据,并存储到指定的字节数组中。返回值为实际读取的字节数。如果已经到达输入流的末尾,则返回-1。

此外,InputStream类还提供了mark(int readlimit)、reset()、available()等方法。其中,mark(int readlimit)方法允许输入流在某个位置设置一个标记,以便后续调用reset()方法时,输入流可以回到该标记处重新读取数据。而reset()方法可以将输入流指针重新设置到最近的标记处。available()方法可以返回当前可用的字节数。

测试用例

下面是一个简单的测试用例,用来测试InputStream类读取文件数据的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.example.javase.se.classes;
 
import java.io.FileInputStream;
import java.io.InputStream;
 
/**
 * @Author ms
 * @Date 2023-11-04 18:17
 */
public class InputStreamTest {
 
    public static void main(String[] args) throws Exception {
        InputStream input = new FileInputStream("test.txt");
        int data = input.read();
        while (data != -1) {
            System.out.println((char) data);
            data = input.read();
        }
        input.close();
    }
}

在上述代码中,我们首先使用FileInputStream类打开一个文件输入流,然后使用InputStream类中的read()方法读取文件数据,并将每个字节转化为字符输出。最终,我们需要记得关闭输入流,以释放资源。

测试结果

根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

测试代码分析

根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

这段代码演示了如何使用Java的输入流来读取一个文件的内容并在控制台输出。具体步骤如下:

  • 首先创建一个InputStream对象,通过FileInputStream指定要读取的文件路径并传入构造函数中。

  • 调用InputStream对象的read()方法读取文件的内容。每次调用read()方法都会读取一个字节,并返回其对应的ASCII码值。

  • 使用while循环不断地读取文件,当读取到文件末尾时,read()方法会返回-1。

  • 将每个字节的ASCII码值转换成对应的字符,并在控制台上输出。

  • 最后关闭InputStream对象,释放资源。

需要注意的是,在使用输入流读取文件时,需要处理异常,因此代码中使用了throws Exception来抛出可能的异常。另外,还应该在读取文件后关闭输入流,以免造成资源浪费或文件被占用的情况。

全文小结

本文以Java中InputStream类为切入点,介绍了Java中的输入流概念及其应用。我们深入解析了InputStream类的源代码实现,并结合实际应用场景进行案例说明。同时,我们分析了InputStream类的优缺点,以及类方法的具体介绍和测试用例。

InputStream类是Java中所有输入流的父类,提供了读取不同类型数据的方法。InputStream类的常用子类有FileInputStream、ByteArrayInputStream等。在Java开发中,InputStream类的应用涉及到文件读写、网络传输等多个方面。

总结

本文介绍了Java中的输入流概念及其应用,以InputStream类为切入点,深入解析了该类的源代码实现,并结合实际应用场景进行案例说明。同时,文章分析了InputStream类的优缺点,以及类方法的具体介绍和测试用例。InputStream类是Java中所有输入流的父类,提供了读取不同类型数据的方法,并且常用的子类有FileInputStream、ByteArrayInputStream等。在Java开发中,InputStream类的应用涉及到文件读写、网络传输等多个方面。该篇文章对Java开发的初学者和爱好者都有一定的参考价值。

以上就是Java利用InputStream类实现文件读取与处理的详细内容,更多关于Java InputStream文件读取与处理的资料请关注脚本之家其它相关文章!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://juejin.cn/post/7298645543706279951

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • spring retry实现方法请求重试的使用步骤

    spring retry实现方法请求重试的使用步骤

    这篇文章主要介绍了spring retry实现方法请求重试及使用步骤,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 举例讲解设计模式中的访问者模式在Java编程中的运用

    举例讲解设计模式中的访问者模式在Java编程中的运用

    这篇文章主要介绍了举例讲解设计模式中的访问者模式在Java编程中的运用,访问者模式是一种将算法与对象结构分离的软件设计模式,需要的朋友可以参考下
    2016-05-05
  • MyBatis-Plus 自动填充的实现示例

    MyBatis-Plus 自动填充的实现示例

    MyBatis-Plus 提供了自动填充功能,帮助开发者在插入或更新数据时,自动为某些字段赋值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • Java中常用的设计模式之建造者模式详解

    Java中常用的设计模式之建造者模式详解

    这篇文章主要为大家详细介绍了Java中常用的设计模式之建造者模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 使用sharding-jdbc实现水平分表的示例代码

    使用sharding-jdbc实现水平分表的示例代码

    本文主要介绍了sharding-jdbc实现水平分表,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Spring Boot 异步框架的使用详解

    Spring Boot 异步框架的使用详解

    这篇文章主要介绍了Spring Boot 异步框架的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Java面向对象的三大特征

    Java面向对象的三大特征

    这篇文章主要给大家结合相关示例介绍了Java面向对象的三大特征:封装、继承、多态,非常的实用,有需要的小伙伴可以参考下。
    2015-06-06
  • Linux部署springboot项目彩色日志打印方式

    Linux部署springboot项目彩色日志打印方式

    这篇文章主要介绍了Linux部署springboot项目彩色日志打印方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java实现布隆过滤器的方法步骤

    Java实现布隆过滤器的方法步骤

    布隆过滤器是可以用于判断一个元素是不是在一个集合里,并且相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。下面这篇文章主要给大家介绍了关于Java实现布隆过滤器的相关资料,需要的朋友可以参考下
    2018-11-11
  • Spring Boot引入swagger-ui 后swagger-ui.html无法访问404的问题

    Spring Boot引入swagger-ui 后swagger-ui.html无法访问404的问题

    这篇文章主要介绍了Spring Boot引入swagger-ui 后swagger-ui.html无法访问404的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09

最新评论