【问题标题】:Java I/O delay creating a file in the file systemJava I/O 延迟在文件系统中创建文件
【发布时间】:2016-06-19 01:22:05
【问题描述】:

我有使用 BufferedWriter 在文件系统中创建文件的旧代码。

问题是当程序中出现一些验证错误时,它会创建一个空文件。 当出现验证错误时,它根本不应该创建文件,但只有在向其中写入数据(验证)时才会检测到错误。 PFB示例代码:

//Legacy code
    File file1= new File(<path to directory>);
    BufferedWriter dBufferedWriter = new BufferedWriter(new FileWriter(file1));

//Code that can have error and this repeats in loop
    String str = "some string or null if error occurs";
    if(validate(str)){  
        dBufferedWriter.write(str);
    }

//Later at end
    dBufferedWriter.close();

有没有办法在不需要时延迟创建文件?

【问题讨论】:

  • 你想避免什么样的错误?你在做什么类型的错误处理?我在你的 sn-p 中没有看到任何内容。
  • 请给我们一个完整的例子来说明你在这里想要完成的事情,还有作者在测试什么?
  • 例如,如果 str = "password" 我想跳过创建文件。对字符串值有什么规则并不重要,但对字符串进行了一些验证。让我修改代码来解释一下。
  • 我会做 private boolean validateContent(Object data) 。 IF 且仅 IF 其罚款然后调用文件 io 部分
  • 什么是dBufferedWriter?此代码无法编译。

标签: java file exception io


【解决方案1】:

因此,如果不需要,旧代码不应创建文件。所以修复它。

String str = "some string or null if error occurs";
if(validate(str)){  
    File file1= new File(<path to directory>);
    BufferedWriter writer1 = new BufferedWriter(new FileWriter(file1));
    dBufferedWriter.write(str);
    dBufferedWriter.close();        
}

...假设dBufferedWriterwriter1 是同一个东西。

【讨论】:

    【解决方案2】:

    当您创建新的FileWriter 时,如果此文件不存在,它会创建新文件。如果出现异常不需要任何文件,可以使用try{...}finally{...}

    File file = new File(<path to directory>);
    BufferedWriter dBufferedWriter = new BufferedWriter(new FileWriter(file));
    try{        
        // some code where you can get exception
    
        String str = "some string or null if error occurs";
        dBufferedWriter.write(str);     
    }finally{
        dBufferedWriter.close();
        if(file.length()==0) file.delete();
    }
    

    顺便说一句,使用finally 关闭资源是一个好习惯,即使您不需要检查文件长度。

    当然,如果您可以更改旧代码的顺序,请这样做,以便在验证码后创建文件。如果验证循环后出现异常代码将无法到达:

    // some code where you can get exception
    
    Writer fileWriter = new FileWriter(new File(<path to directory>));
    String str = "some string or null if error occurs";
    dBufferedWriter.write(str);     
    dBufferedWriter.close();
    

    【讨论】:

    • 谢谢,我可以这样删除它,但有没有更好的方法呢。就像 Java 应该将文件写入文件系统一样,只有在我知道值正确时才结束。
    • @amitmah 您需要在验证循环中向文件中写入任何内容吗?
    • 不是强制的,循环结束后我可以写。
    • @amitmah 我更新了使用finally 的答案。这种方式更正确。
    • 谢谢,我会试试这个
    猜你喜欢
    • 2011-09-20
    • 2012-06-09
    • 1970-01-01
    • 2017-02-11
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多