如何在不刷新的情况下关闭缓冲编写器?



我编写了一个准备SQL插入语句并将它们存储在文本文件中的方法。在这一点上,它完成了工作,但我有一个完全碍眼的捕获块。如果我能以某种方式关闭缓冲读取器而不隐式调用刷新,那就完美了。这可能吗?如果是,如何?

为了准备用我正在制作的汉字(日语字符(数据填充主表,我正在列出所有字符。数据源是 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,并在此过程中将不完整的文本行写入我的文件。

没有这样的事情:https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/io/BufferedWriter.java#L258

public void close() throws IOException {
synchronized (lock) {
if (out == null) {
return;
}
try {
flushBuffer();
} finally {
out.close();
out = null;
cb = null;
}
}
}

,所以它总是试图刷新,这可能是大多数用户所期望的。

您可以做的是使用内存中BufferedWriter单独生成行。如果它死了,你跳过这条线,如果它有效,你就写它。另外,现在是2019年,所以请开始使用试用资源。

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()

最新更新