「深入理解Java输入流:InputStream」

2024-03-21 06:12

本文主要是介绍「深入理解Java输入流:InputStream」,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

文章目录

  • 前言
  • 摘要
  • InputStream
    • 概述
    • 应用场景
    • 优劣性
      • 优点
      • 缺点
    • 常用方法
    • 从InputStream中读取数据
    • InputStream的异常处理
    • 测试用例
      • 代码示例
      • 代码解析
      • 测试执行结果
    • 注意事项
    • 小结
  • 总结

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~

在这里插入图片描述

前言

  Java作为一门广泛应用于Web开发、移动开发、游戏开发等各种领域的编程语言,其输入输出流的处理也是非常重要的。而其中,输入流(InputStream)则是读取数据的重要方式之一。本文将深入探讨Java输入流的相关知识点,包括如何使用InputStreamInputStream的常用方法和注意事项等。

摘要

  本文主要介绍Java输入流(InputStream)的相关知识,包括InputStream的概述、方法和使用,还介绍了如何从InputStream中读取数据、如何处理异常等细节问题。其中,我们使用了一些常见的方法,如read()read(byte[] b)skip()等等。所有的代码都有相应的注释,帮助读者更好地理解每一行代码的含义。

InputStream

概述

  InputStreamJava I/O库中的一个基本类,它是所有输入流的父类。InputStream用于从输入源读取数据,如文件、网络流、字符串等等。通过InputStream类的子类,我们可以读取各种不同的数据类型(如字节、字符、字符串等)。InputStream在Java中的位置如下图所示:

在这里插入图片描述

应用场景

  InputStream是 Java 中用于读取数据流的抽象类,该类提供了一个基本的读取字节数组的方法,其他的面向具体应用场景的子类如FileInputStreamByteArrayInputStream针对不同的数据源提供了更多的功能。

  1. 读取文件:FileInputStream可以用于读取文件,可以读取任意类型的文件,如文本、图片、视频等。

  2. 读取网络数据:URLConnection.getInputStream()返回的InputStream可以用于读取网络数据,如从一个HTTP连接获取响应。

  3. 读取内存数据:ByteArrayInputStream可以用于读取内存中的数据,如将一个字符串转换为字节数组后再进行处理。

  4. 解压缩数据:GZIPInputStream可以用于解压缩GZIP格式的数据。

优劣性

优点

  1. 支持读取任意类型的数据,因为InputStream是一个抽象类,适用于各种不同的数据源,如文件、网络、内存等。

  2. 读取数据时可以根据需要读取任意长度的字节,不一定要读取整个数据流。

  3. InputStream提供了一些子类,如BufferedInputStream可以提高读取效率,DataInputStream可以读取Java中的基本数据类型。

缺点

  1. 没有提供直接读取字符的方法,需要进行字符编码转换。

  2. 读取数据时不能跳过指定长度的数据,只能读取指定长度的数据。

  3. 对于大数据流,读取速度会比较慢。

常用方法

InputStream有些常用的方法,包括:

  1. read()方法:从输入流中读取一个字节的数据。如果已到达流的末尾,返回-1,否则返回读取的字节数据。
  2. read(byte[] b)方法:从输入流中读取最多b.length个字节的数据到字节数组中。如果已到达流的末尾,返回-1,否则返回读取的字节数。
  3. skip(long n)方法:从输入流中跳过并丢弃n个字节的数据并返回实际跳过的字节数。
  4. available()方法:返回可以从输入流中读取的字节数。
  5. close()方法:关闭输入流,并释放与之相关的资源。

从InputStream中读取数据

使用InputStream读取数据的基本步骤如下:

package com.example.javase.io;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** @author bug菌* @version 1.0* @date 2023/10/13 14:48*/
public class InputStreamTest {public static void main(String[] args) throws IOException {//1. 创建InputStream对象InputStream inputStream = new FileInputStream("./template/hello.txt");//2. 读取数据并写入缓冲区byte[] buf = new byte[1024];int len = 0;while ((len = inputStream.read(buf)) > 0) {//3. 对读取到的数据进行处理//...}//4. 关闭输入流inputStream.close();}
}

上面代码的解释如下:

  1. 第1行创建了一个InputStream对象,这里用的是FileInputStream,读取的是同目录下的文件hello.txt
  2. 第3行-第5行实现了从输入流中读取数据,并且将读取到的数据存储到缓冲区中。
  3. 在第6行中读取到的数据可以进行相应的处理,如写入文件、打印到控制台等等。
  4. 最后在第8行中关闭输入流,释放与之相关的资源。

InputStream的异常处理

  使用InputStream读取数据时,有可能会出现一些异常情况,这时候需要进行相应的异常处理。下面是一个典型的InputStream异常处理代码示例:

    public static void main(String[] args) throws IOException {//1. 创建InputStream对象InputStream inputStream = null;try{inputStream = new FileInputStream("./template/hello.txt");//2.读取数据}catch(FileNotFoundException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}finally{//3.关闭文件流try{inputStream.close();}catch(IOException e){e.printStackTrace();}}}

上面代码的解释如下:

  1. 第3行中的代码是一个典型的try-catch块,使用try语句块包含可能抛出FileNotFoundExceptionIOException异常的代码。
  2. 在第5行中通过finally块确保InputStream对象一定被关闭。如果在try块中打开InputStream成功,这个对象在finally块中被关闭。如果在try块中打开InputStream失败,finally块中有机会关闭默认为nullInputStream对象。
  3. 在catch块中对于FileNotFoundExceptionIOException异常进行了捕获和处理,输出相应的异常信息。

  需要注意的是,每个在try块中打开的资源都需要在finally块中关闭。这是因为在finally块中的代码一定会被执行,无论try块中是否出现异常。

测试用例

  下面是一个基本测试用例,测试输入流从文件hello.txt中读取数据的功能:

代码示例

package com.example.javase.io;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** @author bug菌* @version 1.0* @date 2023/10/13 14:48*/
public class InputStreamTest {public static void main(String[] args) {InputStream inputStream = null;try {//1.创建InputStream对象inputStream = new FileInputStream("./template/hello.txt");//2.读取数据byte[] buf = new byte[1024];int len = 0;while ((len = inputStream.read(buf)) > 0) {String str = new String(buf, 0, len);System.out.println(str);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//3.关闭文件流try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}
}

代码解析

  以上代码是一个Java IO示例程序,用于演示如何使用InputStream读取文件内容。具体解析如下:

  1. 创建InputStream对象

  通过使用FileInputStream类创建一个InputStream对象,该类用于从文件系统中打开一个文件进行读取。在此过程中可能会抛出FileNotFoundException异常,需要进行捕获和处理。

  1. 读取数据

  使用read()方法从文件输入流中读取数据。在此过程中可能会抛出IOException异常,需要进行捕获和处理。read()方法会返回从输入流中读取的字节数,如果返回值为-1,表示已经读取到了文件的末尾。这里将读取到的字节数组转换成字符串输出到控制台。

  1. 关闭流

  在读取数据完成之后,必须关闭文件流。关闭文件流有助于释放文件资源并避免内存泄漏。需要在finally块中使用close()方法关闭文件流,在关闭文件流的过程中可能会抛出IOException异常,需要进行捕获和处理。

测试执行结果

  当我们运行上面的测试用例时,可以看到从hello.txt中读取到的数据将会输出到控制台上。

测试用例执行截图演示:

在这里插入图片描述

注意事项

  1. InputStream是一个抽象类,不能直接实例化。
  2. 通过InputStream的子类对象来读取数据时,应该使用缓冲区数组来减少读取次数,提高效率。
  3. 对于大文件的读取,为了避免发生OutOfMemory的情况,应当考虑使用分段读取的方式,而不是一次读入整个文件。

小结

  本文介绍了Java输入流InputStream的相关知识,包括InputStream的概述、常用方法、从InputStream中读取数据、异常处理以及注意事项等。同时,本文还提供了测试用例来帮助读者更好地理解和应用相关知识。希望读者们能够通过本文的学习,更好地掌握Java输入流的相关知识,并且能够在实际的项目中熟练应用。

总结

  InputStreamJava I/O库中的一个重要基本类,用于从输入源读取数据,并提供了一些常用的方法,如read()read(byte[] b)skip()等等。在使用它时,需要注意很多细节问题,如如何正确地关闭输入流和处理异常等。通过本文的学习,相信读者们对于Java输入流相关的知识和应用将会更加熟练。

这篇关于「深入理解Java输入流:InputStream」的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/831965

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.