Java 常用 IO 类说明以及字节流与字符流的区别说明和案例示范

news2024/10/21 20:55:00

1. Java IO 类概述

1.1 什么是 IO

IO 是 Input/Output(输入/输出) 的缩写,代表了程序与外部环境(如文件、网络、设备等)之间进行数据交换的操作。在 Java 中,IO 操作广泛用于文件读取、写入、网络通信等场景。Java 提供了强大的 IO 类来简化这些操作,并按照不同的数据类型(如字节、字符)和数据源提供了不同的类。

1.2 Java 常用的 IO 类

根据数据处理的方式不同,Java 中的 IO 操作可以分为以下几大类:

  • 字节流:处理二进制数据,适用于图片、音频、视频等非文本数据。
  • 字符流:处理文本数据,适用于字符串、字符等文本文件。

Java IO 常用类如下表:

类别输入类输出类
字节流InputStreamOutputStream
文件字节流FileInputStreamFileOutputStream
字符流ReaderWriter
文件字符流FileReaderFileWriter
缓冲流BufferedInputStreamBufferedOutputStream
缓冲字符流BufferedReaderBufferedWriter

2. 字节流与字符流的区别

Java 中的 IO 操作分为两类:字节流字符流。它们的区别在于处理的数据类型不同。

2.1 什么是字节流

字节流8 位字节 为单位读取或写入数据,适合处理 二进制数据。字节流的常见用法是处理图片、视频、音频等非文本文件。字节流类的主要父类有:

  • InputStream:字节输入流,用于从数据源读取字节。
  • OutputStream:字节输出流,用于将字节写入目标。

常用字节流类包括 FileInputStreamFileOutputStreamBufferedInputStreamBufferedOutputStream 等。

2.2 什么是字符流

字符流16 位字符 为单位进行数据处理,适合处理 文本数据,如字符串和文本文件。字符流类的主要父类有:

  • Reader:字符输入流,用于读取字符数据。
  • Writer:字符输出流,用于写入字符数据。

常用字符流类包括 FileReaderFileWriterBufferedReaderBufferedWriter 等。

2.3 字节流与字符流的区别

区别点字节流字符流
处理的数据类型处理二进制数据,如图片、音频处理文本数据,如文本文件、字符串
数据单位以字节为单位(8 位)以字符为单位(16 位)
使用场景适用于非文本文件的处理适用于文本文件或字符数据的处理
父类InputStreamOutputStreamReaderWriter
常用类FileInputStreamFileOutputStreamFileReaderFileWriter

3. Java IO 常用字节流类

字节流主要用于处理非文本数据。Java 提供了丰富的字节流类来帮助开发者进行文件或网络数据的操作。

3.1 InputStream 类

InputStream 是字节输入流的父类,定义了从不同的输入源(如文件、网络、内存缓冲区)读取字节的基本方法。

常用的 InputStream 子类包括:

  • FileInputStream:用于从文件中读取字节数据。
  • BufferedInputStream:为其他输入流提供缓冲功能,提高读取效率。
  • ByteArrayInputStream:从字节数组中读取数据。

3.2 OutputStream 类

OutputStream 是字节输出流的父类,定义了向不同的输出目标(如文件、网络、内存缓冲区)写入字节的基本方法。

常用的 OutputStream 子类包括:

  • FileOutputStream:用于将字节数据写入文件。
  • BufferedOutputStream:为其他输出流提供缓冲功能,提高写入效率。
  • ByteArrayOutputStream:向字节数组中写入数据。

3.3 FileInputStream 和 FileOutputStream 示例

示例:读取二进制文件

通过 FileInputStream 读取二进制文件(如图片),并将其保存到字节数组中:

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputExample {
    public static void main(String[] args) {
        String filePath = "image.jpg";  // 文件路径
        try (FileInputStream fis = new FileInputStream(filePath)) {
            byte[] data = new byte[fis.available()];
            fis.read(data);  // 将文件内容读取到字节数组中
            System.out.println("读取了 " + data.length + " 个字节的数据");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
示例:写入二进制文件

通过 FileOutputStream 将字节数据写入文件:

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputExample {
    public static void main(String[] args) {
        String filePath = "output.jpg";  // 输出文件路径
        byte[] data = { /* 图片的字节数据 */ };
        
        try (FileOutputStream fos = new FileOutputStream(filePath)) {
            fos.write(data);  // 将字节数据写入文件
            System.out.println("写入了 " + data.length + " 个字节的数据");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这两个例子中,使用了 try-with-resources 语法来确保流的正确关闭,防止资源泄漏。


4. Java IO 常用字符流类

字符流用于处理文本数据,如字符串或文本文件的读取和写入。字符流以 ReaderWriter 为父类,分别对应输入和输出操作。

4.1 Reader 类

Reader 是字符输入流的父类,用于从各种输入源(如文件、内存缓冲区、网络连接)读取字符数据。

常用的 Reader 子类包括:

  • FileReader:从文件中读取字符数据。
  • BufferedReader:提供缓冲功能以提高读取效率。

4.2 Writer 类

Writer 是字符输出流的父类,用于将字符数据写入输出目标(如文件、内存缓冲区、网络连接)。

常用的 Writer 子类包括:

  • FileWriter:向文件写入字符数据。
  • BufferedWriter:提供缓冲功能以提高写入效率。

4.3 FileReader 和 FileWriter 示例

示例:读取文本文件

通过 FileReaderBufferedReader 读取文本文件的内容:

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

public class FileReaderExample {
    public static void main(String[] args) {
        String filePath = "example.txt";  // 文件路径
        
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);  // 输出文件的每一行
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
示例:写入文本文件

通过 FileWriterBufferedWriter 将文本数据写入文件:

import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;

public class FileWriterExample {
    public static void main(String[] args) {
        String filePath = "output.txt";  // 输出文件路径
        String content = "这是写入文件的文本内容。";

        try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath))) {
            bw.write(content);  // 写入文本内容
            bw.newLine();  // 换行
            bw.write("这是另一行文本。");
            System.out.println("文本内容已成功写入文件。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5. Java 读取和写入文本的综合示例

结合读取和写入操作,展示如何读取一个文件的内容,并将其写入到另一个文件中。

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;

public class FileCopyExample {
    public static void main(String[] args) {
        String inputFilePath = "input.txt";  // 输入文件路径
        String outputFilePath = "output.txt";  // 输出文件路径
        
        try (
            BufferedReader br = new BufferedReader(new FileReader(inputFilePath));
            BufferedWriter bw = new BufferedWriter(new FileWriter(outputFilePath))
        ) {
            String line;
            while ((line = br.readLine()) != null) {
                bw.write(line);  // 将读取的行写入输出文件
                bw.newLine();  // 写入换行符
            }
            System.out.println("文件内容已成功复制到新的文件。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例通过 BufferedReader 读取文本文件,并通过 BufferedWriter 将内容写入到另一个文件中,确保了高效读取和写入操作。


6. 流泄漏问题及如何正确关闭流

6.1 流泄漏问题

在进行 IO 操作时,未能正确关闭流对象会导致资源泄漏问题。Java 的 IO 操作通常涉及文件句柄、网络连接等有限资源,如果这些资源未能及时释放,可能会引发以下问题:

  1. 文件锁未释放:如果文件流未关闭,文件可能仍被锁定,导致其他程序无法访问该文件。
  2. 资源消耗过高:长时间不释放 IO 资源会导致系统资源(如文件句柄)耗尽,从而引发性能问题或系统崩溃。

6.2 如何正确关闭流

为了解决流泄漏问题,Java 提供了多种方法来确保流在使用后被正确关闭:

方法1:显式关闭流

使用 try-finally 结构手动关闭流。

import java.io.FileInputStream;
import java.io.IOException;

public class ExplicitCloseExample {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("example.txt");
            // 执行读取操作
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 确保在 finally 中关闭流
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
方法2:使用 try-with-resources

从 Java 7 开始,提供了 try-with-resources 语法,该结构可以自动关闭实现了 AutoCloseable 接口的资源类,避免了手动关闭流的麻烦。

import java.io.FileInputStream;
import java.io.IOException;

public class TryWithResourcesExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("example.txt")) {
            // 执行读取操作
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 文件流会自动关闭
    }
}

try-with-resources 是推荐的方式,它能够确保即使发生异常,也会自动关闭流,极大地减少了流泄漏的可能性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是DevOps,如何才能获取DevOps相关实践

DevOps 是 “Development”(开发)和 “Operations”(运维)的缩写,代表一种融合开发和运维的文化和实践。它强调开发团队与运维团队的协作,通过自动化流程和持续交付,提高软件交付的速度、质量和…

通过Express + Vue3从零构建一个用户认证与授权系统(三)前端应用工程构建

前言 接下来,我们将使用 Vue 3、TypeScript 和 Vite 构建一个前端应用,与之前构建的后端 API 无缝对接。此前端将处理用户认证、显示用户数据、管理角色和权限,并确保与后端的安全通信。首先,我们来构建一个满足基本开发的前端应…

Spring6梳理14——依赖注入之P命名空间

以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 ①搭建模块 ②引入配置文件 ③创建bean-dip.xml文件 ④创建课程类文件 ⑤创建学生…

【C++】string类(2)

🥳个人主页: 起名字真南 🥳个人专栏:【数据结构初阶】 【C语言】 【C】 目录 引言1 模拟实现string类基本框架2 实现string类中的主要成员函数2.1 Push_Back 函数2.2 reserve 函数2.3 append 函数2.4 c_str 函数2.5 begin ,end 函数2.5 operator 函数2.6…

FileLink内外网文件交换——致力企业高效安全文件共享

随着数字化转型的推进,企业之间的文件交流需求日益增加。然而,传统的文件传输方式往往无法满足速度和安全性的双重要求。FileLink作为一款专注于跨网文件交换的工具,致力于为企业提供高效、安全的文件共享解决方案。 应用场景一:项…

Python酷玩之旅_数据分析入门(matplotlib)

导览 前言matplotlib入门1. 简介1.1 Pairwise data1.2 Statistical distributions1.3 Gridded data1.4 Irregularly gridded data1.5 3D and volumetric data 2. 实践2.1 安装2.2 示例 结语系列回顾 前言 翻看日历,今年的日子已划到了2024年10月19日,今天…

网络空间安全之一个WH的超前沿全栈技术深入学习之路(一:渗透测试行业术语扫盲)作者——LJS

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️ MYSQL REDIS Advanc…

vue登录页面

这里写目录标题 登录业务流程表单如何进行校验自定义校验规则整个表单的统一内容校验 封装登录接口axios的二次封装整个项目api的统一管理 调用接口 登录业务流程 表单如何进行校验 ElementPlus表单组件内置了表单校验功能,只需要按照组件要求配置必要参数即可 1.…

【880线代】线性代数一刷错题整理

第一章 行列式 2024.8.20日 1. 2. 3. 第二章 矩阵 2024.8.23日 1. 2024.8.26日 1. 2. 3. 4. 5. 2024.8.28日 1. 2. 3. 4. 第四章 线性方程组 2024.9.13日 1. 2. 3. 4. 5. 2024.9.14日 1. 第五章 相似矩阵 2024.9.14日 1. 2024.9.15日 1. 2. 3. 4. 5. 6. 7. 2024.9.…

蚂蚁华东师范大学:从零开始学习定义和解决一般优化问题LLMOPT

🎯 推荐指数:🌟🌟🌟 📖 title:LLMOPT: Learning to Define and Solve General Optimization Problems from Scratch 🔥 code:https://github.com/caigaojiang/LLMOPT &am…

YOLOv11改进-卷积-空间和通道重构卷积SCConv

本篇文章将介绍一个新的改进模块——SCConv(小波空间和通道重构卷积),并阐述如何将其应用于YOLOv11中,显著提升模型性能。为了减少YOLOv11模型的空间和通道维度上的冗余,我们引入空间和通道重构卷积。首先,…

如何开启华为交换机 http

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

pc轨迹回放制作

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:pc轨迹回放制作 主要内容:制作车辆轨迹操作页,包括查询条件、动态轨迹回放、车辆轨迹详情表单等 应用场景:车辆…

14.归一化——关键的数据预处理方法

引言 在人工智能(AI)和机器学习中,归一化(Normalization)是一个重要的预处理步骤。它的主要目的是将数据转换到某个特定的范围。归一化可以帮助模型更高效地学习和提高预测的准确性。归一化在数据预处理方法中占据核心…

Jupyter Notebook中 Save and Export Notebook As不显示选项

问题 Jupyter Notebook中 Save and Export Notebook As 不显示选项(保存和导出没有选项) 解决 在jupyter notebook所在环境卸载jupyter_contrib_nbextensions,这是我之前安装的一个扩展工具集,从而导致上面的问题。 pip unin…

自动化数据处理:使用Selenium与Excel打造的数据爬取管道

随着互联网信息爆炸式增长,获取有效数据成为决策者的重要任务。人工爬取数据不仅耗时且效率低下,因此自动化数据处理成为一种高效解决方案。本文将介绍如何使用Selenium与Excel实现数据爬取与处理,结合代理IP技术构建一个可稳定运行的数据爬取…

Nodejs使用http模块创建Web服务器接收解析RFID读卡器刷卡数据

本示例使用设备: https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1buHvw58&ftt&id22173428704 Javascript源码 //引用http模块创建web服务器,监听指定的端口获取以GET、POST、JSON等方式上传的数据,并回应驱动读卡…

图像梯度-Sobel算子、scharrx算子和lapkacian算子

文章目录 一、认识什么是图像梯度和Sobel算子二、Sobel算子的具体使用三、scharrx算子与lapkacian(拉普拉斯)算子 一、认识什么是图像梯度和Sobel算子 图像的梯度是指图像亮度变化的空间导数,它描述了图像在不同方向上的强度变化。在图像处理和计算机视觉中&#x…

CUDA error: out of memory问题

加载模型时,模型也不大,GPU内存也完全够,但就是出现这个CUDA内存溢出问题。 究其原因,在于model.load_state_dict(torch.load(‘pretrain-model.pth’, map_locationdevice))这个代码省略了map_locationdevice 通过torch.load加载…

YOLOv11来了 | 自定义目标检测

概述 YOLO11 在 2024 年 9 月 27 日的 YOLO Vision 2024 活动中宣布:https://www.youtube.com/watch?vrfI5vOo3-_A。 YOLO11 是 Ultralytics YOLO 系列的最新版本,结合了尖端的准确性、速度和效率,用于目标检测、分割、分类、定向边界框和…