如何利用InputStream类实现文件读取与处理?

2024-05-27 14:12

本文主要是介绍如何利用InputStream类实现文件读取与处理?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

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

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

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

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

前言

  在Java开发中,输入流(InputStream)是一个非常重要的概念,它涉及到文件读写、网络传输等多个方面。InputStream类是Java中输入流的抽象基类,定义了读取输入流数据的方法。本文将以InputStream类为切入点,介绍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类的定义:

public abstract class InputStream implements Closeable {//...
}

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

源代码解析

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

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

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类及其子类可以从不同的输入源中读取数据,如文件、网络、字节数组等。下面是一个小例子,演示如何从文件中读取数据:

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类从字节数组中读取数据。下面是一个示例代码:

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类读取文件数据的功能:

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的输入流来读取一个文件的内容并在控制台输出。具体步骤如下:

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

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

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

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

  5. 最后关闭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开发的初学者和爱好者都有一定的参考价值。

… …

文末

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

… …

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

wished for you successed !!!


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

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

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

… …

文末

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

… …

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

wished for you successed !!!


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

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

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

这篇关于如何利用InputStream类实现文件读取与处理?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1007706

相关文章

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需

基于Python实现智能天气提醒助手

《基于Python实现智能天气提醒助手》这篇文章主要来和大家分享一个实用的Python天气提醒助手开发方案,这个工具可以方便地集成到青龙面板或其他调度框架中使用,有需要的小伙伴可以参考一下... 目录项目概述核心功能技术实现1. 天气API集成2. AI建议生成3. 消息推送环境配置使用方法完整代码项目特点

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请