Java文件名验证-GetCanonicalPath()的影响

Java文件名验证-GetCanonicalPath()的影响,java,Java,我的问题与要测试的函数有关,即路径是否包含给定操作系统不允许的字符。例如,对于Windows,这可能是诸如“>”、“|”或“:”等字符(请参阅) 我使用的代码与此网页上建议的代码基本相同: private boolean testifilenameisvalid(字符串fileUri){ 布尔值无效=真; 试一试{ 文件候选=新文件(fileUri); //有关行: //如果将其删除,将不会检测到无效的文件名。 candidate.getCanonicalPath(); 布尔值b=候选者.cr

我的问题与要测试的函数有关,即路径是否包含给定操作系统不允许的字符。例如,对于Windows,这可能是诸如“>”、“|”或“:”等字符(请参阅)

我使用的代码与此网页上建议的代码基本相同:

private boolean testifilenameisvalid(字符串fileUri){
布尔值无效=真;
试一试{
文件候选=新文件(fileUri);
//有关行:
//如果将其删除,将不会检测到无效的文件名。
candidate.getCanonicalPath();
布尔值b=候选者.createNewFile();
如果(b){
candidate.delete();
}
无效=错误;
}捕获(IOException ioEx){}
返回无效;
}
我对这段代码的问题是我用注释标记的行。删除此行时,函数将不会发现无效的文件名

因此,如果按照上面列出的方式使用代码,例如,在Windows计算机上会检测到以下文件名无效:

C:\Users\Me\f:ile.txt
如果删除此行,则上述文件名将标记为有效

由于这段代码似乎没有设置任何内容,我不明白为什么这一行对函数结果有如此大的影响。有人能给我解释一下这种行为吗?

这是代码

下面是它调用的
isInValid()
方法的代码

final boolean More ...isInvalid() {
         if (status == null) {
             status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
                                                        : PathStatus.INVALID;
         }
         return status == PathStatus.INVALID;
     }
final boolean More…isInvalid(){
如果(状态==null){
status=(this.path.indexOf('\u0000')<0)?PathStatus.CHECKED
:PathStatus.INVALID;
}
返回状态==路径状态。无效;
}
它检查路径是否有效。如果不是,则抛出异常。如果传递的文件路径无效,
getCanonicalPath
将引发异常。因为您没有捕捉到它,并且在开始时invalid是
false
,所以它返回
false


正如我在评论中所说,始终捕获异常使用您是否注意到您的方法名为testifilename IsValid(),而该方法返回是否无效?如果该方法返回true,则表示文件名无效。是的,我的错。在我的项目中,它实际上被称为略有不同,因此返回值更适合。只是为了这个问题而重命名了它,以表明它实际上与这里使用的方法相同,因为如果没有其他信息,项目内部名称可能听起来很奇怪。我会在将来注意这些缺陷。非常感谢。我自己应该想到的。太固定了,在创建文件时会发生异常(显然,认为这不如测试)。有时候我太盲目了,看不到显而易见的东西。然而,我再次对整个事件进行了重新调试,更仔细地观察异常出现的位置。似乎
isValid()
不负责,因为它只测试文件末尾的最后一个空字符。似乎分别是
canonicalize()
方法,即引发实际异常的
canonicalize0()
方法(本机代码!?)。不客气。例外情况的存在是有原因的,所以要养成经常使用它们的习惯。
final boolean More ...isInvalid() {
         if (status == null) {
             status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
                                                        : PathStatus.INVALID;
         }
         return status == PathStatus.INVALID;
     }