【Java基础-51.5】字节流与字符流的转换:Java I/O 中的桥梁
在 Java 的 I/O 操作中,字节流和字符流是两种常见的数据处理方式。字节流以字节为单位进行读写,适合处理二进制数据(如图片、音频等);而字符流以字符为单位进行读写,适合处理文本数据。在实际开发中,我们经常需要在字节流和字符流之间进行转换,以满足不同的需求。
本文将详细介绍如何在 Java 中进行字节流与字符流的转换,并探讨其背后的原理和应用场景。
1. 字节流与字符流的基本概念
1.1 字节流
字节流是 Java I/O 中最基本的数据流,它以字节为单位进行数据的读写。字节流的核心类是 InputStream 和 OutputStream,它们分别用于读取和写入字节数据。
InputStream:字节输入流的基类,常见子类有FileInputStream、ByteArrayInputStream等。OutputStream:字节输出流的基类,常见子类有FileOutputStream、ByteArrayOutputStream等。
1.2 字符流
字符流是 Java 为了方便处理文本数据而引入的,它以字符为单位进行数据的读写。字符流的核心类是 Reader 和 Writer,它们分别用于读取和写入字符数据。
Reader:字符输入流的基类,常见子类有FileReader、InputStreamReader等。Writer:字符输出流的基类,常见子类有FileWriter、OutputStreamWriter等。
2. 字节流与字符流的转换
Java 提供了两个关键的桥接类来实现字节流与字符流之间的转换:
InputStreamReader:将字节输入流转换为字符输入流。OutputStreamWriter:将字节输出流转换为字符输出流。
这两个类的核心作用是将字节流与字符流之间的编码和解码过程封装起来,使得我们可以方便地在字节流和字符流之间进行切换。
2.1 字节流转换为字符流
2.1.1 使用 InputStreamReader
InputStreamReader 是字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;public class ByteToCharExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("input.txt");InputStreamReader isr = new InputStreamReader(fis);BufferedReader br = new BufferedReader(isr)) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}
代码解析:
FileInputStream用于读取字节数据。InputStreamReader将字节流转换为字符流。BufferedReader用于高效读取字符数据。
2.1.2 指定字符集
InputStreamReader 允许指定字符集来解码字节数据。例如,使用 UTF-8 字符集:
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
2.2 字符流转换为字节流
2.2.1 使用 OutputStreamWriter
OutputStreamWriter 是字符流到字节流的桥梁。它将字符编码为字节,并写入字节输出流。
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.IOException;public class CharToByteExample {public static void main(String[] args) {try (FileOutputStream fos = new FileOutputStream("output.txt");OutputStreamWriter osw = new OutputStreamWriter(fos);BufferedWriter bw = new BufferedWriter(osw)) {bw.write("Hello, 世界!");} catch (IOException e) {e.printStackTrace();}}
}
代码解析:
FileOutputStream用于写入字节数据。OutputStreamWriter将字符流转换为字节流。BufferedWriter用于高效写入字符数据。
2.2.2 指定字符集
OutputStreamWriter 也允许指定字符集来编码字符数据。例如,使用 UTF-8 字符集:
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
3. 转换的原理
字节流与字符流之间的转换本质上是编码与解码的过程:
- 字节流 → 字符流:通过
InputStreamReader,将字节数据按照指定的字符集解码为字符。 - 字符流 → 字节流:通过
OutputStreamWriter,将字符数据按照指定的字符集编码为字节。
字符集(Charset)是转换的关键。常见的字符集包括:
- UTF-8:一种变长的 Unicode 编码,兼容 ASCII。
- GBK:中文编码标准。
- ISO-8859-1:拉丁字母编码。
4. 应用场景
4.1 文件读写
在文件读写中,字节流适合处理二进制文件(如图片、视频),而字符流适合处理文本文件。通过 InputStreamReader 和 OutputStreamWriter,可以轻松实现字节流与字符流之间的转换。
4.2 网络通信
在网络通信中,数据通常以字节流的形式传输。如果需要处理文本数据,可以使用 InputStreamReader 和 OutputStreamWriter 将字节流转换为字符流。
4.3 数据编码转换
在处理不同编码的文本数据时,可以通过 InputStreamReader 和 OutputStreamWriter 实现编码的转换。例如,将 GBK 编码的文件转换为 UTF-8 编码:
try (FileInputStream fis = new FileInputStream("input_gbk.txt");InputStreamReader isr = new InputStreamReader(fis, "GBK");FileOutputStream fos = new FileOutputStream("output_utf8.txt");OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");BufferedReader br = new BufferedReader(isr);BufferedWriter bw = new BufferedWriter(osw)) {String line;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();}
} catch (IOException e) {e.printStackTrace();
}
5. 总结
字节流与字符流的转换是 Java I/O 操作中的重要技能。通过 InputStreamReader 和 OutputStreamWriter,我们可以轻松实现字节流与字符流之间的转换,从而满足不同的数据处理需求。
- 字节流 → 字符流:使用
InputStreamReader。 - 字符流 → 字节流:使用
OutputStreamWriter。
在实际开发中,合理选择字节流或字符流,并根据需要转换,可以大大提高代码的灵活性和效率。
相关文章:
【Java基础-51.5】字节流与字符流的转换:Java I/O 中的桥梁
在 Java 的 I/O 操作中,字节流和字符流是两种常见的数据处理方式。字节流以字节为单位进行读写,适合处理二进制数据(如图片、音频等);而字符流以字符为单位进行读写,适合处理文本数据。在实际开发中&#x…...
如何设置爬虫的访问频率?
设置爬虫的访问频率是确保爬虫行为合法且不给目标网站服务器造成过大压力的重要措施。合理的访问频率可以有效避免被网站封禁IP,同时也能保证爬虫的效率。以下是一些设置爬虫访问频率的方法和策略: 一、设置请求间隔 (一)固定间隔…...
如何排查服务器内存泄漏问题
服务器内存泄漏是一种常见的问题,可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤: 排查服务器内存泄漏问题的步骤: 监控系统资源: 使用系统监控工具(如top、htop、free&#x…...
Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器
Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器 打开终端,下载谷歌浏览器软件包: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb下载完成后直接在原终端执行: sudo…...
有关Java中的集合(1):List<T>和Set<T>
学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点:有序表示存取有序(因为有索引)而且可以重复 ● List常用实现类: ArrayList、LinkedList、Vector等 1.1 常用方法…...
【C++STL之vector】vector容器浅析
文章目录 🌟 深入探索C vector:从青铜到王者的动态数组进阶指南 🌟🚀 开篇:为什么vector是C程序员的瑞士军刀?🔍 一、vector的本质解密:不只是智能数组那么简单1.1 动态数组的华丽蜕…...
如何通过卷积神经网络(CNN)有效地提取图像的局部特征,并在CIFAR-10数据集上实现高精度的分类?
目录 1. CNN 提取图像局部特征的原理 2. 在 CIFAR - 10 数据集上实现高精度分类的步骤 2.1 数据准备 2.2 构建 CNN 模型 2.3 定义损失函数和优化器 2.4 训练模型 2.5 测试模型 3. 提高分类精度的技巧 卷积神经网络(Convolutional Neural Network, CNN&#…...
Redis的持久化-RDBAOF
文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发。 …...
Redis 的几个热点知识
前言 Redis 是一款内存级的数据库,凭借其卓越的性能,几乎成为每位开发者的标配工具。 虽然 Redis 包含大量需要掌握的知识,但其中的热点知识并不多。今天,『知行』就和大家分享一些 Redis 中的热点知识。 Redis 数据结构 Redis…...
Rust WebAssembly 入门教程
一、开发环境搭建 1. 基础工具安装 # 安装 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装 wasm-pack cargo install wasm-pack# 安装开发服务器 cargo install basic-http-server# 安装文件监听工具 cargo install cargo-watch2. VSCode 插件安装…...
靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连
靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵,这里只有两个端口,感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...
机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】
目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具,便于在客户端软件中…...
Android 中 ConstrantLayout 与 RelativeLayout 区别
ConstraintLayout 和 RelativeLayout 都是 Android 开发中常用的布局容器,它们都可以用于构建复杂的用户界面,但在功能、性能、使用方式等方面存在一些区别,下面为你详细介绍: 1. 布局原理 RelativeLayout:RelativeL…...
【3DMAX室内设计】2D转3D平面图插件2Dto3D使用方法
【一键筑梦】革新性2Dto3D插件,轻松实现2D平面图向3D空间的华丽蜕变。这款专为3DMAX室内设计师设计的神器,集一键式墙体、门、窗自动生成功能于一身,能够将2D图形无缝转化为3D网格对象(3D平面图、鸟瞰图),一…...
vscode 查看3d
目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件: 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程:开始是绿屏,过了1到2秒,后来就正常看了。 2. vsc…...
自动驾驶---不依赖地图的大模型轨迹预测
1 前言 早期传统自动驾驶方案通常依赖高精地图(HD Map)提供道路结构、车道线、交通规则等信息,可参考博客《自动驾驶---方案从有图迈进无图》,本质上还是存在问题: 数据依赖性高:地图构建成本昂贵…...
perl初试
我手头有一个脚本,用于从blastp序列比对的结果文件中,进行文本处理, 获取序列比对最优的hit记录 #!/usr/bin/perl -w use strict;my ($blast_out) ARGV; my $usage "This script is to get the best hit from blast output file wit…...
VS Code C++ 开发环境配置
VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…...
Web Snapshot 网页截图 模块代码详解
本文将详细解析 Web Snapshot 模块的实现原理和关键代码。这个模块主要用于捕获网页完整截图,特别优化了对动态加载内容的处理。 1. 模块概述 snapshot.py 是一个功能完整的网页截图工具,它使用 Selenium 和 Chrome WebDriver 来模拟真实浏览器行为&am…...
Java TCP 通信:实现简单的 Echo 服务器与客户端
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。与 UDP 不同,TCP 保证了数据的顺序、可靠性和完整性,适用于需要可靠传输的应用场景,如文件传输、网页浏览等。本文将基于 Java 实现一个简单的…...
Windows 10 下 SIBR Core (i.e. 3DGS SIBR Viewers) 的编译
本文针对在 Windows 10 上从源码编译安装3DGS (3D Gaussian Splatting)的Viewers 即SIBR Core及外部依赖库extlibs(预编译的版本直接在页面https://sibr.gitlabpages.inria.fr/download.html下载) ,参考SIBR 的官方网站…...
JavaWeb-HttpServletRequest请求域接口
文章目录 HttpServletRequest请求域接口HttpServletRequest请求域接口简介关于请求域和应用域的区别 请求域接口中的相关方法获取前端请求参数(getParameter系列方法)存储请求域名参数(Attribute系列方法)获取客户端的相关地址信息获取项目的根路径 关于转发和重定向的细致剖析…...
【C++】switch 语句编译报错:error: jump to case label
/home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp: In member function ‘virtual u32 CRkVpss::Control(u32, void*, u32)’: /home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp:242:8: error: jump to case label242 | case emRkComCmd_DBG_SaveInput:|…...
防火墙虚拟系统实验
拓扑图 需求一 安全策略要求: 1、只存在一个公网IP地址,公司内网所有部门都需要借用同一个接口访问外网 2、财务部禁止访问Internet,研发部门只有部分员工可以访问Internet,行政部门全部可以访问互联网 3、为三个部门的虚拟系统分…...
点云滤波方法:特点、作用及使用场景
点云滤波是点云数据预处理的重要步骤,目的是去除噪声点、离群点等异常数据,平滑点云或提取特定频段特征,为后续的特征提取、配准、曲面重建、可视化等高阶应用打下良好基础。以下是点云中几种常见滤波方法的特点、作用及使用场景:…...
Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南
Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南 在 Java 项目开发中,使用 Lombok 可以极大地减少样板代码(如 getter/setter 方法、构造器等),提高开发效率。然而,当使用 Gradle 构建工具并将项目发布到私…...
ArcGIS Pro 基于基站数据生成基站扇区地图
在当今数字化的时代,地理信息系统(GIS)在各个领域都发挥着至关重要的作用。 ArcGIS Pro作为一款功能强大的GIS软件,为用户提供了丰富的工具和功能,使得数据处理、地图制作和空间分析变得更加高效和便捷。 本文将为您…...
【Python · Pytorch】Conda介绍 DGL-cuda安装
本文仅涉及DGL库介绍与cuda配置,不包含神经网络及其训练测试。 起因:博主电脑安装了 CUDA 12.4 版本,但DGL疑似没有版本支持该CUDA版本。随即想到可利用Conda创建CUDA12.1版本的虚拟环境。 1. Conda环境 1.1 Conda环境简介 Conda࿱…...
Spring AI:开启Java开发的智能新时代
目录 一、引言二、什么是 Spring AI2.1 Spring AI 的背景2.2 Spring AI 的目标 三、Spring AI 的核心组件3.1 数据处理3.2 模型训练3.3 模型部署3.4 模型监控 四、Spring AI 的核心功能4.1 支持的模型提供商与类型4.2 便携 API 与同步、流式 API 选项4.3 将 AI 模型输出映射到 …...
leetcode:2965. 找出缺失和重复的数字(python3解法)
难度:简单 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从…...
