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-Type
的charset
告诉浏览器用什么编码解析。
四、常见应用场景比较表
场景 | 方法 | 数据类型 | 示例 |
---|---|---|---|
上传 JSON 数据 | req.getReader() | 文本 | application/json |
返回网页 HTML | resp.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
这两套机制分别优化了“可读性”和“性能”,混用会导致乱码或传输错误。