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

时间:2019-09-16 08:03:16

标签: java bufferedwriter

我写了一种准备SQL插入语句并将其存储在文本文件中的方法。至此就完成了工作,但我有一个大难题。如果我能以某种方式关闭BufferedReader而不隐式调用flush,那将是完美的。那可能吗?如果是,怎么办?

为准备将要存储的汉字(日文字符)数据填充到主表中,准备列出所有字符。数据源是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,并在过程中编写了一个我文件中的文本行不完整。

1 个答案:

答案 0 :(得分:0)

没有这样的东西: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()。 >