我想将输入流转换为字节数组。我知道我可以使用来自commons-io的IOUtils。但我正在练习java io中的一些基础知识。我使用BufferedReader读取了一个xml文件,并尝试使用BufferedWriter将其写入ByteArrayOutputStream。但它不起作用。
当我直接写入ByteArrayOutputStream时,它正在工作。我的代码有什么问题?
try (InputStream inputStream = getClass().getResourceAsStream(
"/productInventory.xml");
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(arrayOutputStream));
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(inputStream));) {
String line = "";
while ((line = bufferedReader.readLine()) != null) {
bufferedWriter.write(line);
}
System.out.println(arrayOutputStream.size());
} catch (IOException e) {
e.printStackTrace();
}
当我在循环中包含以下行时,它的工作
arrayOutputStream.write(line.getBytes(), 0, line.getBytes().length);
使用BufferedWriter时有什么问题?
答案 0 :(得分:5)
没有错 - 它只是缓冲! :d
BufferedWriter的工作原理是将发送到缓冲区中的所有内容过滤到缓冲区中 - 当缓冲区已满,或者当编写器关闭或刷新时(它是一个可关闭的,所以你应该绝对关闭它),它会发送缓冲字符到底层作者。
如果您想要查看基础编写器更新,您必须:
1)填写缓冲区(Java中默认大小为8k)
2)致电.flush()
3)致电.close()
4)正如评论中所提到的,你可以尝试使用资源来隐式关闭:
try (BufferedWriter writer = new BufferedWriter(underlyingWriter)) {
// doStuff
}