(每日持续更新)jdk api之FileInputStream基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

一、java.io

1.20 FileInputStream

FileInputStream 是 Java I/O 包中用于从文件中读取数据的类。以下是关于 FileInputStream 的主要信息:

FileInputStream 介绍:
  • 包路径: java.io

  • 继承关系: FileInputStreamInputStream 的子类,继承了其所有方法。

FileInputStream 所有字段:

FileInputStream 类没有定义自己的字段。

FileInputStream 构造方法:
  • FileInputStream(String name) 创建一个文件输入流,以读取指定名称的文件。

  • FileInputStream(File file) 创建一个文件输入流,以读取指定的 File 对象表示的文件。

  • FileInputStream(FileDescriptor fdObj) 创建一个文件输入流,以读取指定的文件描述符表示的文件。

FileInputStream 方法摘要:

以下是一些常用的方法,完整的方法列表可以参考官方文档。

  • int read() 从输入流中读取数据的下一个字节。

  • 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() 关闭输入流并释放与该流关联的所有系统资源。

简单使用例子:

以下是一个简单的使用 FileInputStream 读取文件内容的例子:

javaCopy code
import java.io.FileInputStream;
import java.io.IOException;
​
public class FileInputStreamExample {
​
    public static void main(String[] args) {
        String filePath = "example.txt";
​
        try (FileInputStream fis = new FileInputStream(filePath)) {
            int data;
            while ((data = fis.read()) != -1) {
                // 处理读取到的字节数据,这里简单打印字符
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们使用 FileInputStream 打开一个文件,并通过 read() 方法逐字节读取文件内容。读取的字节数据可以根据需要进行处理,这里简单地将其强制转换为字符并打印出来。使用 try-with-resources 语句确保在读取完成后自动关闭文件输入流。

应用场景
介绍

FileInputStream 主要用于从文件中读取数据,因此适用于许多场景,其中一些包括:

  1. 文件内容读取:

    • 最常见的用途是从文件中读取内容。可以使用 FileInputStream 逐字节或逐块读取文件数据。

  2. 文件复制:

    • 用于实现文件复制操作,通过 FileInputStream 读取源文件的内容,然后使用 FileOutputStream 将内容写入目标文件。

  3. 文本文件解析:

    • 在文本文件中读取数据,例如配置文件、日志文件或其他文本格式的数据文件。可以使用 FileInputStreamBufferedReader 一起读取文件的文本内容。

  4. 字节流处理:

    • 用于处理二进制文件,如图像、音频或视频文件。可以使用 FileInputStream 读取字节数据,并根据需要进行进一步处理。

  5. 网络编程:

    • 在网络编程中,FileInputStream 可用于读取从网络连接接收的数据。例如,接收到的数据可能需要保存到文件中。

  6. 数据验证:

    • 在某些情况下,可能需要验证文件的特定部分或完整性。通过使用 FileInputStream 读取文件内容,可以进行验证操作。

  7. 资源加载:

    • 在某些应用程序中,可能需要加载外部资源,如配置文件或用户数据文件。FileInputStream 可用于加载这些资源的内容。

  8. 日志文件分析:

    • 用于分析日志文件,从中提取信息以进行报告、监控或其他分析。可以使用 FileInputStream 读取日志文件中的数据。

  9. 缓存和数据处理:

    • 用于将文件内容读取到内存中进行缓存或进一步处理。例如,读取图像文件以进行图像处理。

  10. 安全性检查:

  • 用于执行文件的安全性检查,检查文件的内容以确保符合特定的安全标准。

这些只是 FileInputStream 的一些常见应用场景,实际上,它可以用于许多需要从文件中读取数据的情况。要注意,在读取大文件时,最好结合使用缓冲流(BufferedInputStream)以提高性能。

代码及实现

FileInputStream 主要用于从文件中读取数据,以下是几种应用场景及相应的简单代码实现事项:

  1. 文件内容读取和处理:

  • 应用场景: 读取文件内容,并对每个字节进行处理。

  • 代码实现:

    javaCopy code
    try (FileInputStream fis = new FileInputStream("example.txt")) {
        int data;
        while ((data = fis.read()) != -1) {
            // 处理每个字节的逻辑
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
  • 事项: 需要注意处理每个字节的逻辑,例如打印到控制台或存储到数据结构中。

  1. 文本文件解析和处理:

  • 应用场景: 从文本文件中读取数据,并进行解析和处理。

  • 代码实现:

    javaCopy code
    try (FileInputStream fis = new FileInputStream("data.txt");
         InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
         BufferedReader reader = new BufferedReader(isr)) {
    ​
        String line;
        while ((line = reader.readLine()) != null) {
            // 处理每行文本的逻辑
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
  • 事项: 使用字符流 (InputStreamReaderBufferedReader) 进行文本解析,以便处理字符串而不是字节。

  1. 文件复制:

  • 应用场景: 复制一个文件到另一个文件。

  • 代码实现:

    javaCopy code
    try (FileInputStream sourceStream = new FileInputStream("source.txt");
         FileOutputStream targetStream = new FileOutputStream("target.txt")) {
    ​
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = sourceStream.read(buffer)) != -1) {
            targetStream.write(buffer, 0, bytesRead);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
  • 事项: 使用缓冲区(byte[] buffer)以提高文件复制的效率。

  1. 网络编程:

  • 应用场景: 从网络连接中读取数据。

  • 代码实现:

    javaCopy code
    try (Socket socket = new Socket("example.com", 8080);
         InputStream inputStream = socket.getInputStream()) {
    ​
        int data;
        while ((data = inputStream.read()) != -1) {
            // 处理从网络接收的字节数据
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
  • 事项: 需要适应网络编程的异常处理和连接管理。

  1. 资源加载:

  • 应用场景: 从文件系统加载资源文件到应用程序。

  • 代码实现:

    javaCopy code
    try (FileInputStream fis = new FileInputStream("resource.txt")) {
        // 读取资源文件的逻辑
    } catch (IOException e) {
        e.printStackTrace();
    }
  • 事项: 资源文件可以是配置文件、模板文件或其他应用程序所需的数据。

这些场景提供了一些基本的用例,实际应用中可能涉及更复杂的业务逻辑和异常处理。在所有情况下,都需要适当地关闭流以释放资源,并注意处理可能的异常情况。

实战例子

让我们考虑一个简单的项目实战例子:一个文本文件搜索工具。该工具允许用户输入一个目录路径和一个关键词,然后搜索该目录下的所有文本文件,找到包含关键词的行,并输出匹配的行以及所在文件的信息。

以下是一个简化版本的项目实战代码:

javaCopy code
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
​
public class TextFileSearchTool {
​
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
​
        // 获取用户输入的目录路径和关键词
        System.out.print("Enter the directory path to search: ");
        String directoryPath = scanner.nextLine();
​
        System.out.print("Enter the keyword to search: ");
        String keyword = scanner.nextLine();
​
        // 搜索并输出匹配的行和文件信息
        searchAndPrintMatches(directoryPath, keyword);
    }
​
    private static void searchAndPrintMatches(String directoryPath, String keyword) {
        File directory = new File(directoryPath);
​
        // 遍历目录下的所有文本文件
        List<File> textFiles = listTextFiles(directory);
​
        for (File textFile : textFiles) {
            // 搜索文件中包含关键词的行
            List<String> matchingLines = searchKeywordInFile(textFile, keyword);
​
            // 输出匹配的行和文件信息
            if (!matchingLines.isEmpty()) {
                System.out.println("Matches found in file: " + textFile.getName());
                for (String line : matchingLines) {
                    System.out.println(line);
                }
                System.out.println();
            }
        }
    }
​
    private static List<File> listTextFiles(File directory) {
        List<File> textFiles = new ArrayList<>();
​
        if (directory.isDirectory()) {
            File[] files = directory.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isFile() && file.getName().toLowerCase().endsWith(".txt")) {
                        textFiles.add(file);
                    }
                }
            }
        }
​
        return textFiles;
    }
​
    private static List<String> searchKeywordInFile(File file, String keyword) {
        List<String> matchingLines = new ArrayList<>();
​
        try (FileInputStream fis = new FileInputStream(file);
             InputStreamReader isr = new InputStreamReader(fis);
             BufferedReader reader = new BufferedReader(isr)) {
​
            String line;
            int lineNumber = 1;
            while ((line = reader.readLine()) != null) {
                if (line.toLowerCase().contains(keyword.toLowerCase())) {
                    matchingLines.add("Line " + lineNumber + ": " + line);
                }
                lineNumber++;
            }
​
        } catch (IOException e) {
            e.printStackTrace();
        }
​
        return matchingLines;
    }
}

这个例子中,我们实现了一个简单的文本文件搜索工具。用户可以输入要搜索的目录路径和关键词。工具会遍历指定目录下的所有文本文件,搜索包含关键词的行,并输出匹配的行以及所在文件的信息。在实际应用中,可能需要添加更多的功能和改进,比如支持不同文件类型、多线程搜索等。这个例子提供了一个基本框架,你可以根据具体需求进行扩展。

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

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

相关文章

1.14寒假集训

A: 解题思路&#xff1a;按照题目意思模拟即可&#xff0c;只要不满足条件就输出“No”然后结束循环&#xff0c;否则最后输出“Yes”。 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() { int n,arr[100000],index 0; cin >…

Vue中的v-model

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介基本用法文本输入框复选框下拉框 原理解析文本输入框的原理复选框和下拉框的原理 ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 V…

CAN/CANFD数据记录仪汽车电子售后神器

CAN数据记录仪是一种用于采集和存储CAN总线数据的工具&#xff0c;广泛应用于汽车、轨道车辆、工业控制等大数据量且不易排查故障的系统中。它可以实时存储总线上的数据&#xff0c;方便后续的研究和分析。解决工程师售后难点。 在选择CAN数据记录仪时&#xff0c;需要根据实…

堆排序——高效解决TOP-K问题

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 引言什么是堆&#xff1f;建堆堆排序&#xff1a;排序的最终结果 堆排序实现函数声明交换函数 Swap下沉调整 DnAdd堆排序函数 HeapSort主函数 文件中找…

一天吃透Java并发面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创…

通过离散点拟合曲线

文章目录 使用离散点拟合曲线参考代码路径:作者源码:测试代码效果图:k3k4k5 使用离散点拟合曲线 参考代码路径: https://www.bragitoff.com/2015/09/c-program-for-polynomial-fit-least-squares/ https://gist.github.com/Thileban/272a67f2affdc14a5f69ad3220e5c24b https:/…

PID横向控制和仿真实现

文章目录 1. PID介绍2. PID横向控制原理3. 算法和仿真实现 1. PID介绍 PID是一种常见的控制算法&#xff0c;全称为Proportional-Integral-Derivative&#xff0c;即比例-积分-微分控制器。PID控制器是一种线性控制器&#xff0c;它将设定值与实际值进行比较&#xff0c;根据误…

基于51单片机的模拟量输入输出通道实验

实验一 模拟量输入输出通道实验&#xff08;C51&#xff09; 一、实验目的&#xff1a; 1、了解A/D、D/A转换的基本原理。 2、了解A/D转换芯片ADC0809、D/A转换芯片DAC0832的性能及编程方法。 3、掌握过程通道中A/D转换与D/A转换与计算机的接口方法。 4、了解计算机如何进…

VSCode 正则表达式 匹配多行

VS Code 正则表达式匹配多行 (.|\n)*? //test.js const test {str: VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code 正则表达式匹配多行VS Code …

数据库作业二

一&#xff0c;单表查询 1.创建表 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的…

【WPF.NET开发】WPF中的版式

本文内容 改进的文本质量和性能丰富的版式增强的国际文本支持增强的字体支持新的文本应用程序编程接口 (API) 本主题介绍 WPF 的主要版式功能。 这些功能包括改进的文本呈现质量和性能、OpenType 版式支持、增强的国际文本、增强的字体支持和新的文本应用程序编程接口 (API)。…

2024多系统萎缩最新全球特效药治疗进展

多系统萎缩是一种罕见的神经退行性疾病&#xff0c;由于缺乏有效的治疗方法&#xff0c;患者经常面临症状无法缓解和生活品质下降的困扰。然而&#xff0c;近期刘家峰大夫基于中医理论研究和临床实践&#xff0c;采用中药治疗多系统萎缩取得了显著疗效&#xff0c;给患者带来了…

VUE好看的个人简历模板

文章目录 1.设计来源1.1 首页界面1.2 关于我界面1.3 我的资历界面1.4 项目经验界面1.5 我的技能界面1.6 联系我界面 2.效果和源码2.1 动态效果2.2 源码目录结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/…

RMI简介

RMI 介绍 RMI (Remote Method Invocation) 模型是一种分布式对象应用&#xff0c;使用 RMI 技术可以使一个 JVM 中的对象&#xff0c;调用另一个 JVM 中的对象方法并获取调用结果。这里的另一个 JVM 可以在同一台计算机也可以是远程计算机。因此&#xff0c;RMI 意味着需要一个…

线程安全2

文章目录 锁的可重入性死锁内存可见性引起的线程安全 锁的可重入性 直观来看这个代码不能运行 为啥没有出现阻塞&#xff1f; 当前由于是同一个线程&#xff0c;此时的锁对象&#xff0c;就知道了第二次加锁的线程&#xff0c;就是持有锁的线程&#xff0c;第二次操作&#xff…

Linux下如何快速调试I2C设备

Linux下如何快速调试I2C设备 目录 1 什么场景下需要快速调试I2C设备 2 如何快速调试I2C设备 3 如何获取I2C Tools工具集 3.1 获取I2C Tools工具集源码 3.2 编译I2C Tools工具集源码 3.3 为设备添加I2C Tools工具集 4 如何使用I2C Tools工具集 5 小结 1 什么场景下需要快…

VScode设置自动添加自定义注释及修改字体

首先安装snippet mac可以键入commanp&#xff0c;输出> 选择自己所需的需要自动添加的文件类型配置文件 安装自己的需要修改 "Print to console": {"prefix": "xx", // 自己键入内容"body": [ // 注释信息"// xxx …

SpringMVC RESTful案例

文章目录 1、准备工作2、功能清单3、具体功能&#xff1a;访问首页a>配置view-controllerb>创建页面 4、具体功能&#xff1a;查询所有员工数据a>控制器方法b>创建employee_list.html 5、具体功能&#xff1a;删除a>创建处理delete请求方式的表单b>删除超链接…

docker部署私人云盘nextcloud

首先查看效果 1.拉取镜像 docker pull nextcloud 2.创建目录 mkdir -p /data/nextcloud/{config,data,apps} 3.创建实例 docker run -itd --name yznextcloud -v /data/nextcloud/config:/var/www/html/config -v /data/nextcloud/data:/var/www/html/data -v /data/nextc…
最新文章