Java流的奥秘:字节与字符的交响乐章

在Java编程的广阔天地中,数据的流动如同一条条看不见的河流,滋养着程序的生命力。而流(Stream)作为数据传输的核心机制,承载着数据的读写重任。今天,我们将深入探讨字节流与字符流的精妙之处,解锁它们背后的编程艺术。

第一章:字节流的基石 —— 构建数据的桥梁

字节流是Java中用于处理二进制数据的基础,它们以8位字节的形式传输数据。在Java标准库中,java.io.InputStreamjava.io.OutputStream是所有字节流的根类,提供了读取和写入数据的基本方法。

1.1 文件输入/输出流

FileInputStreamFileOutputStream是最常用的字节流,用于读写文件系统中的数据。

示例:读取文件内容

import java.io.FileInputStream;
import java.io.IOException;public class FileInputStreamExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("path/to/file.bin")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = fis.read(buffer)) != -1) {System.out.println(new String(buffer, 0, bytesRead));}} catch (IOException e) {System.err.println("读取文件失败:" + e.getMessage());}}
}

1.2 缓冲字节流

为了提高性能,BufferedInputStreamBufferedOutputStream提供了带有内部缓冲区的字节流,减少了系统调用的频率。

示例:使用缓冲字节流

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;public class BufferedInputStreamExample {public static void main(String[] args) {try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("path/to/file.bin"))) {int data;while ((data = bis.read()) != -1) {System.out.print((char) data);}} catch (IOException e) {System.err.println("读取文件失败:" + e.getMessage());}}
}
第二章:字符流的篇章 —— 文本的优雅表达

字符流专门用于处理文本数据,它们以字符为单位进行读写,通常使用java.io.Readerjava.io.Writer作为基类。

2.1 字符输入/输出流

FileReaderFileWriter是字符流中用于文件读写的常见实现。

示例:写入文本到文件

import java.io.FileWriter;
import java.io.IOException;public class FileWriterExample {public static void main(String[] args) {try (FileWriter writer = new FileWriter("path/to/file.txt")) {writer.write("Hello, world!");writer.flush();} catch (IOException e) {System.err.println("写入文件失败:" + e.getMessage());}}
}

2.2 缓冲字符流

BufferedReaderBufferedWriter提供了一种高效的方式来读写字符数据,内置的缓冲区可以显著提高性能。

示例:逐行读取文本文件

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class BufferedReaderExample {public static void main(String[] args) {try (BufferedReader reader = new BufferedReader(new FileReader("path/to/file.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {System.err.println("读取文件失败:" + e.getMessage());}}
}
第三章:流的高级应用 —— 装饰器模式与自定义流

Java中的流设计采用了装饰器模式,允许在已有的流上添加额外的功能而不改变其接口。

3.1 装饰器模式示例

例如,PrintStream就是一个装饰器,它可以将字节流转换为打印流,提供方便的格式化输出方法。

示例:使用PrintStream

import java.io.PrintStream;public class PrintStreamExample {public static void main(String[] args) {try (PrintStream ps = new PrintStream(System.out)) {ps.printf("The answer is %d\n", 42);}}
}

3.2 自定义流的封装

你还可以创建自己的流类来满足特定需求,如压缩流GZIPOutputStreamGZIPInputStream,或者加密流等。

示例:创建自定义计数输出流

import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class CountingOutputStream extends FilterOutputStream {private int count = 0;public CountingOutputStream(OutputStream out) {super(out);}@Overridepublic void write(int b) throws IOException {super.write(b);count++;}public int getCount() {return count;}
}// 使用示例
public class UseCountingOutputStream {public static void main(String[] args) {try (OutputStream out = new CountingOutputStream(System.out)) {out.write("Hello, World!".getBytes());CountingOutputStream cos = (CountingOutputStream) out;System.out.println("字符总数:" + cos.getCount());} catch (IOException e) {System.err.println("写入时发生错误:" + e.getMessage());}}
}
第四章:流的管理 —— 资源释放与异常处理

在使用流时,资源管理和异常处理至关重要。Java 7引入了try-with-resources语句,自动关闭实现了AutoCloseable接口的资源,简化了代码。

示例:使用try-with-resources

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class TryWithResourcesExample {public static void main(String[] args) {try (BufferedReader reader = new BufferedReader(new FileReader("path/to/file.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {System.err.println("读取文件失败:" + e.getMessage());}}
}

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

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

相关文章

视频监控平台LntonCVS视频融合共享平台智慧安防视频监控汇聚应用方案

LntonCVS是一款功能强大且灵活部署的安防视频监控平台。它支持多种主流标准协议,包括GB28181、RTSP/Onvif、RTMP等,同时能够兼容海康Ehome、海大宇等厂家的私有协议和SDK接入。该平台不仅提供传统的安防监控功能,还支持接入AI智能分析&#x…

无人机之产业链篇

无人机产业链上游为无人机设计研发及关键原材料的生产,其中关键原材料有金属材料和复合材料两大类,包括钛合金、铝合金、陶瓷基等特殊材料 中游无人机整机制造包括飞行系统、地面系统、任务载荷系统三个方面,是无人机制造的核心部分&#xf…

Adobe国际认证详解-网页设计认证专家行业应用场景解析

在当今数字化时代,网页设计已成为各行各业不可或缺的一环。而网页设计认证专家,作为经过Adobe国际认证体系严格考核的专业人才,正逐渐成为行业内炙手可热的存在。他们凭借深厚的网页设计理论基础和实践经验,为各行各业提供了高质量…

144. 字典序最小的 01 字符串(卡码网周赛第二十六期(23年阿里淘天笔试真题))

题目链接 144. 字典序最小的 01 字符串(卡码网周赛第二十六期(23年阿里淘天笔试真题)) 题目描述 小红有一个 01 字符串,她可以进行最多 k 次提作,每次操作可以交换相邻的两个字符,问可以得到的…

java设计模式:03-06-享元模式

享元模式(Flyweight Pattern) 享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享技术来有效地支持大量细粒度对象的重用。享元模式避免了在相似对象间的高开销,通过共享尽可能多的状态来尽量减…

正则表达式:电子邮件地址的格式详解,及常见正则表达式符号的详细解释和匹配方式

一、第一部分是对该段电子邮件的详解 var Regex /^(?:\w\.?)*\w(?:\w\.)*\w$/; 1.^:这个符号表示匹配输入字符串的开始位置。 2.(?:...):这是一个非捕获组(non-capturing group),用于将正则表达式的一部分组合在…

B端产品经理能力培养(四)

B端产品经理能力模型 通用能力 学习能力 沟通能力 行业融入感主人翁精神 心态和情商 专业素养 责任心 自驱力、执行力 基础认知 产品行业认知:当前公司的产品所属细分领域、所处行业趋势、提供怎样的服务、产品和方案解决了客户哪些问题。 产品聚焦领域&a…

【Langchain大语言模型开发教程】模型、提示和解析

🔗 LangChain for LLM Application Development - DeepLearning.AI 学习目标 1、使用Langchain实例化一个LLM的接口 2、 使用Langchain的模板功能,将需要改动的部分抽象成变量,在具体的情况下替换成需要的内容,来达到模板复用效…

【Linux服务器Java环境搭建】012在linux中安装消息队列RabbitMQ,以及对RabbitMQ设置、启动、开启可视化

系列文章目录 【Linux服务器Java环境搭建】 前言 上一篇博客竟然用了不到半小时就写完了,那就继续吧,如果对此系列感兴趣,可以点击系列【Linux服务器Java环境搭建】进行查看哈,这一篇主要是安装和配置消息队列RabbitMQ。 一、消…

[解决方法]git上传的项目markdown文件的图片无法显示

应该有不少初学者会遇到这种情况 以下是本人摸索出的解决方法 我使用的是typora,首先设置typora的图片设置 文件>偏好设置>图像 如下: 选择这个就会在此文件的同级目录下创建一个assets文件夹来存放此markdown文件的所有图片 然后勾选优先使用相…

monocle3拟时序分析怎么做到多样本间pseudotime值可比?

愿武艺晴小朋友一定得每天都开心 monocle3呢,有好多文章分享了它的流程。跟着学呢,也都能计算出一套pseudotime值。 在跑monocle3时,我就有一个困惑产生了:monocle3计算的pseudotime值在多样本间可比,该怎么做到呀&am…

在 ASP.NET Core Web API 中实现审计跟踪

一.介绍 审计跟踪对于跟踪数据变化、维护安全性规至关重要。在本文中,我们将在 ASP.NET Core Web API 中实现审计跟踪。该示例将涵盖从设置项目到执行 CRUD 操作和验证审计日志的所有内容。 二.先决条件 Visual Studio 或 Visual Studio CodeSQL Server&#xff…

学习大数据DAY20 Linux环境配置与Linux基本指令

目录 Linux 介绍 Linux 发行版 Linux 和 Windows 比较 Linux 就业方向: 下载 CentOS Linux 目录树 Linux 目录结构 作业 1 常用命令分类 文件目录类 作业 2 vim 编辑文件 作业 3 你问我第 19 天去哪了?第 19 天在汇报第一阶段的知识总结,没什…

QT5:多窗口跳转

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助 目录 前言 一、环境 二、步骤 三、代码实现 四、效果图 前言 学习使用qt5完成多窗口(界面)跳转:从主界面可分别跳转至界面一和界面二&#xf…

Spring Boot集成SFTP快速入门Demo

1.什么是SFTP? SFTP(SSH File Transfer Protocol,也称 Secret File Transfer Protocol),是一种基于SSH(安全外壳)的安全的文件传输协议。使用SFTP协议可以在文件传输过程中提供一种安全的加密算…

主从复制 哨兵服务 数据类型 持久化

配置主从复制 一主多从结构 配置一主一从结构 修改配置文件 配置salve服务器 配置带验证的主从复制 查看密码,默认redis服务没有密码 192.168.88.61:6379> config get requirepass 设置密码 192.168.88.61:6379> config set requirepass 123456 输入密码…

Spring Boot2(Spring Boot 的Web开发 springMVC 请求处理 参数绑定 常用注解 数据传递)

目录 一、Spring Boot 的Web开发 1. 静态资源映射规则 2. enjoy模板引擎 二、springMVC 1. springMVC-请求处理 测试: 以post方式请求 限制请求携带的参数 GetMapping 查询 PostMapping 新增 DeleteMapping删除 PutMapping 修改 2. springMVC-参…

HarmonyOS鸿蒙- 跳转系统应用能力

一、通过弹窗点击设置跳转系统应用能力 1、 自定义弹窗效果图 2、 自定义弹窗代码 import { common, Want } from kit.AbilityKit; import { BusinessError } from kit.BasicServicesKit;export function alertDialog() {AlertDialog.show({title: ,message: 当前功能依赖定位…

ranger审计日志对接CDH solr

作者:耀灵 一、准备条件 1、已安装完毕ranger-admin 2、已在CDH上部署solr(注意在安装solr时更改下solr在zk上的节点信息) 二、更改相关配置 1、修改ranger-2.1.0-admin/contrib/solr_for_audit_setup/install.properties SOLR_USERsolr …

音视频环境搭建

整体流程参考: Windows 10开发环境搭建 这里记录一下期间的遇到的问题: 下载的ffmpeg,将ffmpeg的bin目录添加到系统环境变量,然后将SDL的dll动态库拷贝到ffmpeg的bin目录下或将其所在的目录也添加到环境变量,不一定非要…