在 java 中将字符串写入输出流
writing string to outputstream in java
我有一个简单的 servlet class returns CSV 文件到客户端(浏览器)。当我尝试将字符串写入流时。最初我遵循示例 A) 但是我注意到附加了预期数据的子集。
假设我希望在 csv 文件中准确捕获 100 条记录。每条记录代表 "first name/last name/age"。在示例 A) 中,我得到 120。前 100 条记录是正确的,但在本例中附加了 100 的子集 20(重复)。
示例 A)
public void returnCSV(HttpServletResponse resp, String data) {
ServletOutputStream out = resp.getOutputStream();
InputStream in = new ByteArrayInputStream(data.getBytes("UTF-8"));
byte[] bytes = new byte[4096];
while (in.read(bytes,0,4096) != -1) {
out.write(bytes,0,4096);
}
in.close();
out.flush();
out.close();
}
阅读更多有关将字符串转换为流的线程后。我决定按照示例 B) 进行操作,该示例生成了正确的输出 100 条记录。但是我不明白为什么第一个示例 A) 会添加重复数据。
示例 B)
public void returnCSV(HttpServletResponse resp, String data) {
ServletOutputStream out = resp.getOutputStream();
out.write(data.getBytes("UTF-8"));
out.flush();
out.close();
}
看看这个循环:
while (in.read(bytes,0,4096) != -1) {
out.write(bytes,0,4096);
}
无论 read
读取多少数据,您总是写出 4096 字节。你只想复制你读过的相同数量的数据,例如
int bytesRead;
while ((bytesRead = in.read(bytes)) != -1) {
out.write(bytes, 0, bytesRead);
}
有很多第三方库具有从输入流复制到输出流的代码,请注意 - 无论如何您都应该使用 try-with-resources 语句来关闭流。
此外,您应该在调用 ServletResponse.setCharacterEncoding
之后调用 ServletResponse.getWriter
,而不是调用 getOutputStream
,以确保它使用的是 UTF-8。然后你可以打电话:
writer.write(data);
Writers 是为编写文本数据而设计的;输出流旨在写入二进制数据。您可以使用 OutputStreamWriter
在流之上创建一个编写器,但是由于 servlet API 会为您做这件事,您不妨让它...
我有一个简单的 servlet class returns CSV 文件到客户端(浏览器)。当我尝试将字符串写入流时。最初我遵循示例 A) 但是我注意到附加了预期数据的子集。
假设我希望在 csv 文件中准确捕获 100 条记录。每条记录代表 "first name/last name/age"。在示例 A) 中,我得到 120。前 100 条记录是正确的,但在本例中附加了 100 的子集 20(重复)。
示例 A)
public void returnCSV(HttpServletResponse resp, String data) {
ServletOutputStream out = resp.getOutputStream();
InputStream in = new ByteArrayInputStream(data.getBytes("UTF-8"));
byte[] bytes = new byte[4096];
while (in.read(bytes,0,4096) != -1) {
out.write(bytes,0,4096);
}
in.close();
out.flush();
out.close();
}
阅读更多有关将字符串转换为流的线程后。我决定按照示例 B) 进行操作,该示例生成了正确的输出 100 条记录。但是我不明白为什么第一个示例 A) 会添加重复数据。
示例 B)
public void returnCSV(HttpServletResponse resp, String data) {
ServletOutputStream out = resp.getOutputStream();
out.write(data.getBytes("UTF-8"));
out.flush();
out.close();
}
看看这个循环:
while (in.read(bytes,0,4096) != -1) {
out.write(bytes,0,4096);
}
无论 read
读取多少数据,您总是写出 4096 字节。你只想复制你读过的相同数量的数据,例如
int bytesRead;
while ((bytesRead = in.read(bytes)) != -1) {
out.write(bytes, 0, bytesRead);
}
有很多第三方库具有从输入流复制到输出流的代码,请注意 - 无论如何您都应该使用 try-with-resources 语句来关闭流。
此外,您应该在调用 ServletResponse.setCharacterEncoding
之后调用 ServletResponse.getWriter
,而不是调用 getOutputStream
,以确保它使用的是 UTF-8。然后你可以打电话:
writer.write(data);
Writers 是为编写文本数据而设计的;输出流旨在写入二进制数据。您可以使用 OutputStreamWriter
在流之上创建一个编写器,但是由于 servlet API 会为您做这件事,您不妨让它...