【问题标题】:Create a loop that creates files to a given directory创建一个循环,将文件创建到给定目录
【发布时间】:2021-02-12 22:36:09
【问题描述】:

我正在尝试创建一个根据某些条件创建文件的循环。 (一些数据库的大小)

问题是当我使用字符串引用作为文件名时它会失败,但如果我直接在参数中创建字符串,它会正常工作。

for(int i = 0; i < (sizeOf/dataPerFile+1) ; i++){
            Date date = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
            String strDate= formatter.format(date);

            System.out.println((strDate+"_Backup"+i+".txt"));
            System.out.println(System.getProperty("user.dir").replace("/someproject", "")+"/backup/");
            new File((System.getProperty("user.dir").replace("/someproject", "")+"/backup/"+(strDate+"_Backup"+i+".txt"))).createNewFile();
        }

    }catch (IOException | SQLException | NumberFormatException a){
        System.out.println("Failed");
        System.out.println(a.fillInStackTrace());
    }

失败信息

Connected
30/10/2020_Backup0.txt
java.io.IOException: No such file or directory

我的第一个猜测是我的计算机在使用给定字符串值之前没有正确计算它们。但不确定。

有什么想法吗?

【问题讨论】:

  • 可以分享一下失败信息吗?您发布的代码是否描述了该问题?
  • 存在多个问题,看不到您的输出与代码匹配。尝试使用 java.nio.Files ,它的方法可以帮助您事先创建目录或使用 apache 公共库。

标签: java string loops file


【解决方案1】:

正如上述大多数回复所回答的那样,错误在带有正斜杠的日期格式内。 - 那些小但破坏性的错误......

更改了日期格式的正斜杠并修复了它。它现在运行良好。 :-)

谢谢!

【讨论】:

    【解决方案2】:

    调用createNewFile时需要确保所有子目录都存在。

    由于dd/MM/yyyy模式用于文件名,这意味着目录30/10必须存在于backup目录中。

    这可以通过使用File.mkdirs()命令创建目录结构,然后使用构造函数File(String path, String filename)existing目录中创建文件来解决。

    try {
        for (int i = 0; i < 5; i++) {
            Date date = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
            String strDate = formatter.format(date);
    
            String dirName = System.getProperty("user.dir").replace("/someproject", "") + "/backup/" + strDate;
            File dir = new File(dirName);
    
            if (dir.mkdirs()) { // create directory structure
                System.out.println("Created backup directory: " + dirName);
            }
            // create files when directory is available
            new File(dirName, "_Backup" + i + ".txt").createNewFile();
        }
    } catch (IOException a) {
        System.out.println("Failed: " + a);
        a.printStackTrace();
    }
    

    注意:可能值得将日期格式更改为 yyyy-MM-dd 以增强按日期对备份进行分组

    【讨论】:

      【解决方案3】:

      您已使用正斜杠格式化日期,因此传递的实际字符串类似于:"/Users/theDev/projects/backup/30/10/2020_Backup0.txt"

      这将尝试在目录"/Users/theDev/projects/backup/30/10" 中创建名为"2020_Backup0.txt" 的文件。除非该目录存在,否则这是行不通的,而且它不存在,因此,您会得到一个 FNFEx。

      大多数操作系统不允许在文件名中使用斜杠。

      如果真的想创建这个文件(我真的怀疑),那么做:

      File f = new File(...);
      f.getParent().mkdirs();
      f.createNewFile();
      

      并考虑使用新的文件 api (java.nio.file)。

      如果您不希望文件这样命名,请将您的 SDF 模式替换为破折号或下划线等。并考虑使用较新的时间 API (java.time) - 您使用的 API 都已过时。

      我的电脑没有正确计算给定的字符串值

      计算机按照规范要求执行,因此是正确的。

      您的异常处理程序已损坏;这不是你这样做的方式。通常,“记录它”不是“处理它”,因此,向前抛出任何已检查的异常(将 throws SQLException, IOException 添加到此方法的签名中。请注意,您的 psv main(String[] args) 方法可以(并且应该!)声明为 @987654329 @。

      fillInStackTrace() 在您调用 fillInStackTrace 时用跟踪覆盖与异常关联的跟踪 - 这绝对不是您想要的(它显示了不在 catch 块中写“只记录它”的智慧:这是一个违反 DRY,这只是一个搞砸的机会。java 基础设施本身已经比你做得更好了。

      如果这不是一个选项,那么这意味着您正在注册以正确处理它(正如我们所提到的,“记录它”是不行的)。如果你不知道,那么'我放弃,我不知道该怎么办'代码是catch (SomethingICantReallyHandle e) { throw new RuntimeException("Unhandled", e); }

      您所做的是删除了大量有用的调试信息,这大概就是您现在就 SO 提出问题的原因。

      【讨论】:

        【解决方案4】:

        我认为这与日期的格式有关。日期中包含“/”字符,文件创建者将其解释为进入下一个目录,尝试

        strDate.replaceAll("/"," ");
        

        也许在那之后它会起作用

        【讨论】:

        • 这让事情变得不必要地复杂化了;只需更新传递给 SDF 的模式字符串。
        猜你喜欢
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 2018-03-18
        相关资源
        最近更新 更多