字节流直接操作byte[]不涉及编码,字符流需经编码/解码且依赖字节流;内存中字节流用bytearrayinputstream/outputstream,字符流需通过inputstreamreader/outputstreamwriter桥接并显式指定编码。

Java 中字节流与字符流在内存中操作字节数据,核心区别在于:字节流直接读写字节数组(byte[]),不涉及编码;字符流则必须经过编码/解码环节,底层仍依赖字节流,但面向的是 char 或 String。
字节流在内存中操作字节数据
使用 ByteArrayInputStream 和 ByteArrayOutputStream,它们把内存中的字节数组当作“虚拟文件”来读写,全程不碰磁盘、不涉及字符集。
-
读取:用
ByteArrayInputStream包装一个byte[],调用read()或read(byte[] b)直接获取原始字节 -
写入:用
ByteArrayOutputStream接收字节,调用write(int)或write(byte[])累积数据,最后用toByteArray()拿回字节数组 - 典型用途:序列化对象转字节数组、网络请求体构造、图片二进制处理、加密解密中间结果缓存
字符流在内存中操作字节数据
字符流本身不能直接操作内存字节数组——它操作的是字符,但可以通过桥接类 InputStreamReader 和 OutputStreamWriter 把字节流“转成”字符流,从而在内存中完成带编码的转换。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
从字节到字符:把
ByteArrayInputStream套上InputStreamReader,指定编码(如 UTF-8),就能按字符读取 -
从字符到字节:把
ByteArrayOutputStream套上OutputStreamWriter,写入字符串后调用flush(),再从baos.toByteArray()获取编码后的字节 -
注意:不显式指定编码时,默认使用平台编码(可能乱码),生产环境务必传入明确的
Charset或字符串名(如"UTF-8")
实际代码对比(内存中处理字符串 "你好")
下面两段都基于内存,但路径不同:
-
纯字节路径:
"你好".getBytes(StandardCharsets.UTF_8)→ 得到 3 字节数组(UTF-8 下“你”占 3 字节)→ 可直接用于网络传输或加密 -
字符流路径:
new OutputStreamWriter(baos, "UTF-8")→write("你好")→baos.toByteArray()→ 结果同上,但多了编码逻辑封装
后者更安全易读,前者更轻量可控。选哪个,取决于你是否需要统一处理文本语义(比如逐行读、跳过 BOM、自动换行适配等)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










