0

我在列表中获得了一些数据,我正在将这些数据进一步写入一个文件中,有两个列表,它们有 croos joi,并且该文件通过缓冲写入器写入一个文件,如现在所示问题是完整的数据没有写入一个文件总共有 907864 行,然后有 905864 行,请告知我在编写文件时为什么缺少 fe 行...

File file = new File(FilePath + getFileName());
            if (file.exists()) {
                file.delete();
            }



            BufferedWriter bw = new  BufferedWriter(new FileWriter(file));


            for (Posuser posuser : totalusers) {
                for (potook bk : books) {

                    if ((posuser.getUpdatedBy() == null)
                            && (posuser.getUpdateddateformat() == null)) {

                        bw.write("aaa"+"\r\n");

                    } else if (posuser.getUpdatedBy() == null
                            && posuser.getUpdateddateformat() != null) {
                        bw.write("bbb+"\r\n");


                    } else if (posuser.getUpdatedBy() != null
                            && posuser.getUpdateddateformat() == null) {
                        bw.write("ccc"+"\r\n");


                    }

                    else
                        bw.write("ddd"+\r\n");


                }

            }

            bw.flush();
            bw.close();

        } catch (Exception e) {

            logger.error(e.getMessage());
        }
    }
4

2 回答 2

0

一种可能的解释是,这是因为您的代码不能可靠地刷新输出:

    try {
        ....
        bw.flush();
        bw.close();

    } catch (Exception e) {

        logger.error(e.getMessage());
    }

如果在“...”部分中抛出任何异常,则不会执行flushand调用。close相反,该方法将(很可能)跳转到处理程序Exception并记录错误。

写这个的正确方法是你要确保输出被刷新/关闭是这样的:

    File file = new File(FilePath + getFileName());
    try (BufferedWriter bw = new  BufferedWriter(new FileWriter(file))) {
        for (Posuser posuser : totalusers) {
            for (potook bk : books) {
                if ((posuser.getUpdatedBy() == null)
                        && (posuser.getUpdateddateformat() == null)) {
                    bw.write("aaa"+"\r\n");
                } else if (posuser.getUpdatedBy() == null
                        && posuser.getUpdateddateformat() != null) {
                    bw.write("bbb+"\r\n");
                } else if (posuser.getUpdatedBy() != null
                        && posuser.getUpdateddateformat() == null) {
                    bw.write("ccc"+"\r\n");
                } else {
                    bw.write("ddd"+\r\n");
                }
            }
        }
    } catch (IOException, AnotherException e) {
        logger.error(e.getMessage());
    }

笔记:

  1. 我正在使用 Java 7“尝试使用资源”语法,它会自动关闭资源对象......在这种情况下是BufferedWriter. 这就是为什么没有明确的close(). (如果你不能使用 Java 7,那么close()在一个finally块中执行。
  2. 没有必要flush()AND close()。首先关闭BufferedWriter隐式刷新和缓冲数据。
  3. 不抓Exception。捕获您期望的已检查异常和特定的未检查异常。如果你 catch Exception,你很可能会捕捉到实际上是错误导致的错误处理异常。
  4. 只是记录异常并继续好像什么都没有发生可能是一个坏主意......

此外,如果文件存在则删除文件开头的代码是不必要的。当您以您的方式打开文件时,如果现有文件存在,它将截断现有文件。

于 2013-08-15T09:58:28.737 回答
0

似乎正在删除创建/现有的文件

 if (file.exists()) {
     file.delete();
  }

替代方案是:

if(!file.createNewFile()){
    System.out.println("File Exists");
}
于 2013-08-15T09:33:10.663 回答