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

发布时间:2024年01月15日

博主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;
 ?  }
}

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

文章来源:https://blog.csdn.net/a89879193/article/details/135592937
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。