gpt4 book ai didi

java - 如何在不刷新的情况下关闭 BufferedWriter?

转载 作者:行者123 更新时间:2023-12-02 00:39:45 25 4
gpt4 key购买 nike

我编写了一个方法来准备 SQL 插入语句并将它们存储在文本文件中。至此,它就完成了工作,但是我有一个完全碍眼的 catch block 。如果我能以某种方式关闭 BufferedReader 而无需隐式调用刷新,那就完美了。那可能吗?如果是,怎么办?

作为准备用汉字(日语字符)数据填充主表以用于我正在制作的内存应用程序,我正在制作所有字符的列表。数据源是 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 block 中的 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-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() 会更漂亮> 在循环中。

关于java - 如何在不刷新的情况下关闭 BufferedWriter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57952663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com