我编写了一个准备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()
。