当前位置: 首页 > news >正文

JavaWeb中字节流与字符流的本质区别

目录

一、核心区别:字节流 vs 字符流

二、在 Java Web 中的典型使用场景

三、使用 Reader / Writer 的方法

1. 从浏览器读取文本(Reader)

2. 返回文本给浏览器(Writer)

四、常见应用场景比较表

五、底层机制总结

六、企业开发中的最佳实践


一、核心区别:字节流 vs 字符流

  • 字节流:传输的是 二进制数据(任何文件都可以)
    适用于图片、音频、视频、PDF 等。

  • 字符流:传输的是 文本数据(只能传输文本)
    自动进行字符编码(UTF-8、GBK 等)解码,更方便处理字符串。

可以理解为:

字节流是原始二进制货物,字符流是已经翻译成人类语言的文本。


二、在 Java Web 中的典型使用场景

在网页开发中:

  • 当浏览器和服务器传输文本内容(HTML、JSON、XML、纯文本)时,用 Reader / Writer

  • 当传输文件或二进制数据时,用 InputStream / OutputStream


三、使用 Reader / Writer 的方法

1. 从浏览器读取文本(Reader)

浏览器发来的数据可能是表单、JSON 等文本内容。

@WebServlet("/textReceiver")
public class TextReceiverServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.setCharacterEncoding("UTF-8"); // 防止中文乱码BufferedReader reader = req.getReader(); // 获取字符输入流StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null) {sb.append(line);}reader.close();System.out.println("收到内容:" + sb.toString());}
}

上面代码中:

  • req.getReader():相当于自动帮你把浏览器发送的字节流转成字符流;

  • 不用管底层的编码,它会自动用请求头中的 charset(默认 UTF-8)解析。


2. 返回文本给浏览器(Writer)

返回 HTML、JSON、字符串等文本数据时,用 PrintWriter

@WebServlet("/textResponse")
public class TextResponseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setContentType("text/html;charset=UTF-8"); // 告诉浏览器使用 UTF-8PrintWriter writer = resp.getWriter(); // 获取字符输出流writer.write("<h1>你好,世界!</h1>");writer.write("<p>这是一个使用Writer输出的HTML内容。</p>");writer.flush();writer.close();}
}

解释一下:

  • resp.getWriter():将 Java 字符流直接写入 HTTP 响应体;

  • Tomcat 会自动把这些字符编码成字节发送给浏览器;

  • Content-Typecharset 告诉浏览器用什么编码解析。


四、常见应用场景比较表

场景方法数据类型示例
上传 JSON 数据req.getReader()文本application/json
返回网页 HTMLresp.getWriter()文本text/html
返回纯文本resp.getWriter()文本text/plain
上传图片/文件req.getInputStream()二进制multipart/form-data
下载文件resp.getOutputStream()二进制application/octet-stream

五、底层机制总结

  • Reader / Writer 实际上是包裹在 InputStream / OutputStream 外层的“字符层”。

  • Reader 通过 InputStreamReader 把字节解码成字符;

  • Writer 通过 OutputStreamWriter 把字符编码成字节;

  • 这层转换依赖字符集(charset),默认 UTF-8,也可以手动指定。

举个例子:

InputStream is = req.getInputStream();
Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8);

这个就是 Servlet 里 getReader() 的本质。


六、企业开发中的最佳实践

在 Web 应用中,建议:

  • 纯文本交互(HTML、JSON、XML)→ 用 Writer/Reader

  • 文件传输(图片、视频、压缩包)→ 用 InputStream/OutputStream

这两套机制分别优化了“可读性”和“性能”,混用会导致乱码或传输错误。

http://www.dtcms.com/a/482290.html

相关文章:

  • 从代码实现到概念创新:AIGC如何重塑数据可视化的价值链条?
  • ONLYOFFICE 前端实现历史记录存储与多人协作完整指南
  • 操作系统准备(UOS)
  • 不想折腾环境?如何最快用上MySQL 8.0?
  • [Dify] 插件输入参数配置详解:让 Agent 能正确理解与填写请求参数
  • 海外网站建设网站登录密码保存在哪里设置
  • 电子商务网站建设的定义网站建设包括哪些东西
  • git和svn服务器的区别和作用
  • 解决打patch冲突
  • 图像处理(三)--开运算与闭运算,梯度运算,礼帽与黑帽
  • 手搓二叉平衡搜索树--AVL树(万字长文/图文详解)
  • 超简单的Windows配置Codex教程
  • 机械网站建设栏目内容网站项目开发的制作流程
  • 模式识别与机器学习课程笔记(6):人工神经网络
  • 岳阳网站开发绍兴seo
  • STM32开发实例_基于STM32单片机的红外测温系统(电路图+程序+流程图)24-32-59
  • NLTK库用法示例:Python自然语言处理入门到实践
  • 待补充 五大关系数据库(sqlserver、mysql、oracle、pgsql、sqlite)的列类型:目录
  • 往kafka创建生产者和消费者,并且打数据和消费数据
  • linux iptables介绍
  • sqlite: 动态列类型
  • 做商品网站数据库有哪些阜阳做网站多少钱
  • 房地产开发公司网站网站推广方案200字
  • Android MVVM架构解析:现代开发的首选模式
  • 车机系统的「共享镜头」:如何实现多用户同时拍照
  • 开源链动2+1模式AI智能名片S2B2C商城小程序在竞争激烈的中低端面膜服装行业中的应用与策略
  • Java学习路线推荐!
  • 网站伪静态是什么意思个人网站设计模板素材
  • 萧山工程建设有限公司网站济南网站建设公司哪家专业
  • KingbaseES JDBC 深度实战指南(上):从驱动选型到连接管理,夯实国产数据库交互基础