在文件中写入时,很少有数据丢失

时间:2013-08-15 09:27:50

标签: java file

我正在获取列表中的一些数据,我正在飞行中写入文件 有两个列表,他们有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());
        }
    }

2 个答案:

答案 0 :(得分:0)

似乎是要删除已创建/现有的文件

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

替代方案是:

if(!file.createNewFile()){
    System.out.println("File Exists");
}

答案 1 :(得分:0)

一种可能的解释是,这种情况正在发生,因为您的代码无法可靠地刷新输出:

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

    } catch (Exception e) {

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

如果在“...”部分中抛出任何异常,则不会执行flushclose次调用。相反,该方法将(很可能)跳转到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()close()。首先关闭BufferedWriter隐式刷新和缓冲数据。
  3. 不要抓住Exception。捕获您所期望的已检查异常和特定未经检查的异常。如果你抓住Exception,你就有可能发现错误的异常,这些异常实际上是由于错误造成的。
  4. 只记录异常并继续,好像什么都没发生可能一个坏主意......

  5. 此外,如果存在的话,删除文件的代码是不必要的。当您按照自己的方式打开文件时,如果存在文件,它将截断现有文件。