如何在不刷新的情况下关闭 BufferedWriter?
How can I close a BufferedWriter without flushing?
我编写了一个方法来准备 SQL 插入语句并将它们存储在文本文件中。在这一点上,它完成了工作,但我有一个完全碍眼的捕获块。如果我能以某种方式关闭 BufferedReader 而无需隐式调用 flush 那将是完美的。那可能吗?如果是,如何?
作为为我正在制作的记忆应用程序使用汉字(日语字符)数据填充大师 table 的准备,我正在制作所有字符的列表。数据源是 KANJIDIC2,一个 UTF-8 编码的 xml 文件,包含 13k+ 个字符的数据。最初的想法是在源文件中包含所有字符,但出于某种原因,当我尝试将它们写入输出文件时,300 多个字符会抛出 java.nio.charset.MalformedInputException
。
我决定放弃这些字符,因为它们不是必需的或任何东西,但在上述异常之后我找不到关闭 BufferedReader 的顺利方法。
File outputFile = new File("C:\Users\tobbelobb\Documents\kanjilist.bsv");
try {
BufferedWriter bw = Files.newBufferedWriter(outputFile.toPath(), StandardCharsets.UTF_8);
for (Kanji nextKanji : kanjiList) {
try {
StringBuilder sb = new StringBuilder();
// sb.append stuff from list of objects...
bw.write(sb.toString());
bw.newLine();
bw.flush();
} catch (MalformedInputException ex) {
// Ungracefully swallow the exception.
ex.printStackTrace();
bw = Files.newBufferedWriter(outputFile.toPath(), StandardCharsets.UTF_8, StandardOpenOption.APPEND);
}
}
bw.close();
} catch (Exception ex) {
ex.printStackTrace();
}
我寻找一种方法来处理 catch 块中的 BufferedReader 对象,但我能找到的唯一方法是 close()
,它再次抛出相同的 MalformedInputException
,并且在此过程中将一行不完整的文本写入我的文件。
public void close() throws IOException {
synchronized (lock) {
if (out == null) {
return;
}
try {
flushBuffer();
} finally {
out.close();
out = null;
cb = null;
}
}
}
所以它总是尝试刷新,这可能是大多数用户所期望的。
你可以做的是使用内存中的 BufferedWriter
单独生成你的行。如果它死了,你跳过这行,如果它有效,你写它。另外,现在是2019年了,请开始使用try-with-resources.
try(BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(outputFile))) {
for (Kanji nextKanji : kanjiList) {
try {
StringBuilder sb = new StringBuilder();
// sb.append stuff from list of objects...
ByteArrayOutputStream baos=new ByteArrayOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(baos));
bw.write(sb.toString());
bw.newLine();
bw.close();
baos.writeTo(bos);
} catch (MalformedInputException ex) {}
}
}
如果它能正常工作(我只是从头开始写),它可以用一个 ByteArrayOutputStream
实例更漂亮,并在循环中使用它的 reset()
。
我编写了一个方法来准备 SQL 插入语句并将它们存储在文本文件中。在这一点上,它完成了工作,但我有一个完全碍眼的捕获块。如果我能以某种方式关闭 BufferedReader 而无需隐式调用 flush 那将是完美的。那可能吗?如果是,如何?
作为为我正在制作的记忆应用程序使用汉字(日语字符)数据填充大师 table 的准备,我正在制作所有字符的列表。数据源是 KANJIDIC2,一个 UTF-8 编码的 xml 文件,包含 13k+ 个字符的数据。最初的想法是在源文件中包含所有字符,但出于某种原因,当我尝试将它们写入输出文件时,300 多个字符会抛出 java.nio.charset.MalformedInputException
。
我决定放弃这些字符,因为它们不是必需的或任何东西,但在上述异常之后我找不到关闭 BufferedReader 的顺利方法。
File outputFile = new File("C:\Users\tobbelobb\Documents\kanjilist.bsv");
try {
BufferedWriter bw = Files.newBufferedWriter(outputFile.toPath(), StandardCharsets.UTF_8);
for (Kanji nextKanji : kanjiList) {
try {
StringBuilder sb = new StringBuilder();
// sb.append stuff from list of objects...
bw.write(sb.toString());
bw.newLine();
bw.flush();
} catch (MalformedInputException ex) {
// Ungracefully swallow the exception.
ex.printStackTrace();
bw = Files.newBufferedWriter(outputFile.toPath(), StandardCharsets.UTF_8, StandardOpenOption.APPEND);
}
}
bw.close();
} catch (Exception ex) {
ex.printStackTrace();
}
我寻找一种方法来处理 catch 块中的 BufferedReader 对象,但我能找到的唯一方法是 close()
,它再次抛出相同的 MalformedInputException
,并且在此过程中将一行不完整的文本写入我的文件。
public void close() throws IOException { synchronized (lock) { if (out == null) { return; } try { flushBuffer(); } finally { out.close(); out = null; cb = null; } } }
所以它总是尝试刷新,这可能是大多数用户所期望的。
你可以做的是使用内存中的 BufferedWriter
单独生成你的行。如果它死了,你跳过这行,如果它有效,你写它。另外,现在是2019年了,请开始使用try-with-resources.
try(BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(outputFile))) {
for (Kanji nextKanji : kanjiList) {
try {
StringBuilder sb = new StringBuilder();
// sb.append stuff from list of objects...
ByteArrayOutputStream baos=new ByteArrayOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(baos));
bw.write(sb.toString());
bw.newLine();
bw.close();
baos.writeTo(bos);
} catch (MalformedInputException ex) {}
}
}
如果它能正常工作(我只是从头开始写),它可以用一个 ByteArrayOutputStream
实例更漂亮,并在循环中使用它的 reset()
。