`response.getOutputStream()` 和 `response.getWriter()` 是 Java Servlet API 中的两个方法,用于获取响应的输出流。这两个方法的主要区别在于它们返回的输出流类型和用途。
**response.getOutputStream()**
`response.getOutputStream()` 方法返回一个 `ServletOutputStream` 对象,这是一个字节流,可以用来发送二进制数据(如图片、音频或视频)到客户端。如果需要发送非文本数据,应该使用此方法。
例如,以下代码使用 `response.getOutputStream()` 来发送一张图片:
```java
// 设置响应类型为图片
response.setContentType("image/jpeg");
// 打开输出流
ServletOutputStream out = response.getOutputStream();
// 读取图片文件并发送到客户端
InputStream in = new FileInputStream(new File("/path/to/image.jpg"));
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
// 关闭输入和输出流
in.close();
out.close();
```
在这个示例中,我们首先设置了响应类型为图片,然后打开了输出流。接着,我们从磁盘上读取一张图片文件,并将其内容写入输出流,最后关闭了输入和输出流。
**response.getWriter()**
`response.getWriter()` 方法返回一个 `PrintWriter` 对象,这是一个字符流,可以用来发送文本数据(如 HTML、XML 或 JSON)到客户端。如果需要发送文本数据,应该使用此方法。
例如,以下代码使用 `response.getWriter()` 来发送一个简单的 HTML 页面:
```java
// 设置响应类型为 HTML
response.setContentType("text/html; charset=UTF-8");
// 打开字符输出流
PrintWriter writer = response.getWriter();
// 发送 HTML 数据
writer.println("<html>");
writer.println("<head><title>Hello World</title></head>");
writer.println("<body>");
writer.println("<h1>Hello World!</h1>");
writer.println("</body>");
writer.println("</html>