【Java基础-51.1】Java中的字节输入流FileInputStream:原理与应用场景

在Java中,FileInputStream是用于从文件中读取字节数据的类。它是InputStream的子类,专门用于处理文件输入流。本文将深入探讨FileInputStream的工作原理、使用方法以及常见的应用场景,帮助开发者更好地理解和使用这一重要的I/O工具。

1. FileInputStream的基本原理

1.1 什么是FileInputStream?

FileInputStream是Java I/O库中的一个类,用于从文件中读取字节数据。它继承自InputStream类,提供了读取文件内容的基本功能。FileInputStream以字节为单位读取文件,适用于读取二进制文件(如图片、音频、视频等)或文本文件。

1.2 FileInputStream的工作原理

FileInputStream通过打开一个与文件关联的输入流来读取文件内容。当创建一个FileInputStream对象时,它会尝试打开指定的文件。如果文件不存在或无法访问,将抛出FileNotFoundException

FileInputStream提供了多种读取方法,最常用的是read()方法。read()方法每次读取一个字节的数据,并返回该字节的整数值(0-255)。如果到达文件末尾,read()方法将返回-1

此外,FileInputStream还提供了read(byte[] b)方法,允许一次性读取多个字节到字节数组中,从而提高读取效率。

1.3 FileInputStream的继承关系

FileInputStream继承自InputStream,而InputStream是所有字节输入流的基类。FileInputStream的主要方法都来自于InputStream,但它还提供了一些与文件操作相关的特定方法。

java.lang.Object
    java.io.InputStream
        java.io.FileInputStream

以下是FileInputStream`类的继承关系图:

«final»
Object
«abstract»
InputStream
+read()
+read(byte[] b)
+close()
FileInputStream
+FileInputStream(String name)
+FileInputStream(File file)
+read()
+read(byte[] b)
+close()

说明:

  1. ObjectObject是Java中所有类的基类,FileInputStream间接继承自Object
  2. InputStreamInputStream是一个抽象类,是所有字节输入流的基类。它定义了读取字节数据的基本方法,如read()close()
  3. FileInputStreamFileInputStream继承自InputStream,专门用于从文件中读取字节数据。它提供了与文件操作相关的构造函数和方法。

关系:

  • ObjectInputStream的父类。
  • InputStreamFileInputStream的父类。

通过这个继承关系图,可以清晰地看到FileInputStream在Java I/O类库中的位置及其与基类的关系。

2. FileInputStream的使用方法

2.1 创建FileInputStream对象

要使用FileInputStream读取文件,首先需要创建一个FileInputStream对象。可以通过以下两种方式创建:

  1. 通过文件路径创建

    FileInputStream fis = new FileInputStream("path/to/file.txt");
    
  2. 通过File对象创建

    File file = new File("path/to/file.txt");
    FileInputStream fis = new FileInputStream(file);
    

2.2 读取文件内容

创建FileInputStream对象后,可以使用read()方法读取文件内容。以下是几种常见的读取方式:

  1. 逐字节读取

    int data;
    while ((data = fis.read()) != -1) {
        System.out.print((char) data); // 将字节转换为字符输出
    }
    
  2. 读取到字节数组中

    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fis.read(buffer)) != -1) {
        System.out.write(buffer, 0, bytesRead); // 输出读取的字节
    }
    

2.3 关闭FileInputStream

使用完FileInputStream后,必须调用close()方法关闭流,以释放系统资源。可以使用try-with-resources语句自动关闭流:

try (FileInputStream fis = new FileInputStream("path/to/file.txt")) {
    int data;
    while ((data = fis.read()) != -1) {
        System.out.print((char) data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

3. FileInputStream的应用场景

3.1 读取二进制文件

FileInputStream非常适合读取二进制文件,如图片、音频、视频等。由于这些文件以字节形式存储,使用FileInputStream可以逐字节读取并处理这些数据。

try (FileInputStream fis = new FileInputStream("image.jpg")) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fis.read(buffer)) != -1) {
        // 处理读取的字节数据
    }
} catch (IOException e) {
    e.printStackTrace();
}

3.2 读取文本文件

虽然FileInputStream主要用于读取二进制文件,但它也可以用于读取文本文件。不过,对于文本文件,通常更推荐使用FileReaderBufferedReader,因为它们可以更方便地处理字符编码和文本行。

try (FileInputStream fis = new FileInputStream("text.txt")) {
    int data;
    while ((data = fis.read()) != -1) {
        System.out.print((char) data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

3.3 文件复制

FileInputStream可以与其他输出流(如FileOutputStream)结合使用,实现文件的复制功能。

try (FileInputStream fis = new FileInputStream("source.txt");
     FileOutputStream fos = new FileOutputStream("destination.txt")) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fis.read(buffer)) != -1) {
        fos.write(buffer, 0, bytesRead);
    }
} catch (IOException e) {
    e.printStackTrace();
}

3.4 网络编程中的文件传输

在网络编程中,FileInputStream可以用于从本地文件读取数据,并通过网络套接字发送到远程服务器。

try (Socket socket = new Socket("server.address", 8080);
     FileInputStream fis = new FileInputStream("file.txt");
     OutputStream os = socket.getOutputStream()) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fis.read(buffer)) != -1) {
        os.write(buffer, 0, bytesRead);
    }
} catch (IOException e) {
    e.printStackTrace();
}

4. FileInputStream的注意事项

  1. 资源释放:使用FileInputStream后,务必调用close()方法释放资源,否则可能导致文件句柄泄漏。推荐使用try-with-resources语句自动关闭流。
  2. 异常处理FileInputStream在操作过程中可能会抛出IOException,因此需要进行适当的异常处理。
  3. 性能优化:对于大文件的读取,建议使用缓冲区(如BufferedInputStream)来提高读取效率。
  4. 字符编码FileInputStream以字节为单位读取数据,不处理字符编码。如果需要处理文本文件的字符编码,建议使用InputStreamReaderFileReader

5. 总结

FileInputStream是Java中用于读取文件字节数据的重要工具。它适用于读取二进制文件、文本文件以及实现文件复制等功能。通过理解FileInputStream的工作原理和使用方法,开发者可以更高效地处理文件I/O操作。在实际应用中,合理使用FileInputStream并结合其他I/O类库,可以大大提高程序的性能和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成

本教程的演示都将在 Flink CDC CLI 中进行,无需一行 Java/Scala 代码,也无需安装 IDE。 这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业,包含整库同步、表结构变更同步演示和关键参数介绍。 准备阶段…

【Maven】基于IDEA进行Maven工程的创建、构建

文章目录 一、基于IDEA创建Maven工程1. 概念梳理Maven工程的GAVP2. Idea构建Maven Java SE工程3. Idea构建Maven Java Web工程3.1 创建一个maven的javase工程3.2 修改pom.xml文件打包方式3.3 设置web资源路径和web.xml路径 4. Maven工程项目结构说明 二、基于IDEA进行Maven工程…

计算机毕业设计SpringBoot+Vue.js在线课程管理系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

【爬虫基础】第二部分 爬虫基础理论 P3/3

上节内容回顾:【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 【爬虫基础】第一部分 网络通讯-编程 P3/3-CSDN博客 【爬虫基础】第二部分 爬虫基础理论 P1/3-CSDN博客 【爬虫基础】第二部分 爬虫基础理论…

【子网掩码计算器:Python + Tkinter 实现】

子网掩码计算器:Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…

【第十节】C++设计模式(结构型模式)-Flyweight( 享元)模式

目录 一、问题背景 二、模式选择 三、代码实现 四、总结讨论 一、问题背景 享元模式(Flyweight Pattern)在对象存储优化中的应用 在面向对象系统的设计与实现中,创建对象是最常见的操作之一。然而,如果一个应用程序使用了过多…

macOS - 使用 tmux

文章目录 安装 tmux使用更多快捷键说明 安装 tmux brew install tmux使用 在终端输入 tmux 进入 tmux 界面,然后 输入 Control Option B 进入交互模式 输入 % 左右分栏," 上下分割 上一个窗格:{,下一个:} PS…

【洛谷贪心算法题】P1094纪念品分组

该题运用贪心算法,核心思想是在每次分组时,尽可能让价格较小和较大的纪念品组合在一起,以达到最少分组的目的。 【算法思路】 输入处理:首先读取纪念品的数量n和价格上限w,然后依次读取每件纪念品的价格,…

16. LangChain实战项目2——易速鲜花内部问答系统

需求简介 易束鲜花企业内部知识库如下: 本实战项目设计一个内部问答系统,基于这些内部知识,回答内部员工的提问。 在前面课程的基础上,需要安装的依赖包如下: pip install docx2txt pip install qdrant-client pip i…

Minio搭建并在SpringBoot中使用完成用户头像的上传

Minio使用搭建并上传用户头像到服务器操作,学习笔记 Minio介绍 minio官网 MinIO是一个开源的分布式对象存储服务器,支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发,拥有轻量级、高性能、易部署等特点,并且可以自由…

Spring AI:让AI应用开发更简单

文章目录 引言什么是Spring AI?核心特性 Spring AI的核心组件ChatClient:聊天模型示例代码图示 ImageClient:图像生成示例代码图示 Prompt Templates:提示词模板示例代码 Spring AI的优势示例项目:智能机票助手代码实现…

【C】链式二叉树算法题1 -- 单值二叉树

leetcode链接https://leetcode.cn/problems/univalued-binary-tree/description/ 1 题目描述 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1&#xff1…

什么是最终一致性,它对后端系统的意义是什么

最终一致性(Eventual Consistency)是分布式系统中的一种一致性模型。与传统的强一致性模型不同,最终一致性并不要求系统在任何时刻都保持一致,而是保证在足够的时间后,所有节点的数据最终会达到一致的状态。换句话说,系统允许短时间内出现数据的不一致性,但最终会通过某…

掌握大模型高效任务流搭建(一):构建LangChain任务流

前言: 在LangChain框架中,“链”占据着核心地位。它允许我们将众多任务模块串联起来,构建出富有弹性的任务流。借助这种链式结构,我们能够处理复杂的逻辑,并实现任务的自动化。在实际场景里,链式操作极大地…

目标检测——数据处理

1. Mosaic 数据增强 Mosaic 数据增强步骤: (1). 选择四个图像: 从数据集中随机选择四张图像。这四张图像是用来组合成一个新图像的基础。 (2) 确定拼接位置: 设计一个新的画布(输入size的2倍),在指定范围内找出一个随机点(如…

塑造网络安全的关键事件

注:本文为 “网络安全” 相关文章合辑。 机翻,未校。 Timeline of Cyber Security: Key Events that Shaped the Field 网络安全时间表:塑造该领域的关键事件 October 29, 2023 Cyberattacks are an everyday threat, always changing. T…

题解 | 牛客周赛82 Java ABCDEF

目录 题目地址 做题情况 A 题 B 题 C 题 D 题 E 题 F 题 牛客竞赛主页 题目地址 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 做题情况 A 题 判断字符串第一个字符和第三个字符是否相等 import java.io.*; import java.math.*; import java.u…

Redis 高可用性:如何让你的缓存一直在线,稳定运行?

🎯 引言:Redis的高可用性为啥这么重要? 在现代高可用系统中,Redis 是一款不可或缺的分布式缓存与数据库系统。无论是提升访问速度,还是实现数据的高效持久化,Redis 都能轻松搞定。可是,当你把 …

uniapp-原生android插件开发摘要

uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语言编写,从HBuilderX 3.6起,新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…

【定昌Linux系统】部署了java程序,设置开启启动

将代码上传到相应的目录,并且配置了一个.sh的启动脚本文件 文件内容: #!/bin/bash# 指定JAR文件的路径(如果JAR文件在当前目录,可以直接使用文件名) JAR_FILE"/usr/local/java/xs_luruan_client/lib/xs_luruan_…