有没有在Java中的方式来确定path是否有效,而不尝试创build一个文件?

我需要确定用户提供的string是否是一个有效的文件path(即如果createNewFile()会成功或抛出一个exception),但我不想膨胀与无用的文件创build的文件系统只是为了validation的目的,有一种方法来确定,如果我有string是一个有效的文件path而不尝试创build文件?

我知道“有效的文件path”的定义取决于操作系统,但我想知道是否有任何快速接受“C:/ foo”或“/ foo”和拒绝“香蕉”的方法…一种可能的方法可能是试图创build该文件,并最终删除它,如果创build成功,但我希望有一个更优雅的方式来实现相同的结果…

这也将检查目录的存在。

File file = new File("c:\\cygwin\\cygwin.bat"); if (!file.isDirectory()) file = file.getParentFile(); if (file.exists()){ ... } 

看起来像file.canWrite()没有给你一个明确的指示,如果你有权限写入目录。

在Java 7中引入的path类添加了新的替代方法,如下所示:
(在Linux无法正常工作 – 总是返回true)

  /** * <pre> * Checks if a string is a valid path. * Null safe. * * Calling examples: * isValidPath("c:/test"); //returns true * isValidPath("c:/te:t"); //returns false * isValidPath("c:/te?t"); //returns false * isValidPath("c/te*t"); //returns false * isValidPath("good.txt"); //returns true * isValidPath("not|good.txt"); //returns false * isValidPath("not:good.txt"); //returns false * </pre> */ public static boolean isValidPath(String path) { try { Paths.get(path); } catch (InvalidPathException | NullPointerException ex) { return false; } return true; } 

当你尝试创build一个文件时,许多事情可能会出错:

  • 您缺乏必要的权限;
  • 设备上没有足够的空间
  • 该设备遇到错误;
  • 一些自定义安全策略禁止您创build特定types的文件;
  • 等等

更重要的是,当你尝试和查询,看看你能不能,当你真的可以。 在multithreading环境中,这是竞争条件的主要原因之一,可能是某些程序的真正脆弱点。

基本上你只需要尝试创build它,看看它是否工作。 这是做到这一点的正确方法。 这就是为什么像ConcurrentHashMap这样的东西有一个putIfAbsent()所以检查和插入是一个primefaces操作,并不受竞争条件的影响。 这里玩的原则完全一样。

如果这只是一些诊断或安装过程的一部分,只要做,看看它是否工作。 再次,不能保证它会在稍后工作。

基本上你的程序必须足够健壮,如果不能写出相关的文件,就会优雅地死去。

File.getCanonicalPath()对此非常有用。 在针对操作系统或文件系统进行parsing时,会针对某些types的无效文件名(例如Windows中的CONPRN*?* )抛出IOexception。 但是,这只是一个初步的检查, 在创build文件时,您仍然需要处理其他故障(例如权限不足,驱动器空间不足,安全限制)。

 boolean canWrite(File file) { if (file.exists()) { return file.canWrite(); } else { try { file.createNewFile(); file.delete(); return true; } catch (Exception e) { return false; } } }