file.exists()在java / mac计算机上错误地返回false?

时间:2017-07-16 14:30:55

标签: java

我有以下代码

    File f = new File(fileSystemPath);
    if(!f.exists())
        throw new IllegalArgumentException("Static File="+getCanonicalPath(f)+" does not exist. fileSysPath="+this.fileSystemPath);

导致以下异常

WEBPIECESxPACKAGE.TestLesson1Json > testSynchronousController FAILED
java.lang.IllegalArgumentException: Static File=/Library/Workflow/webpieces/webserver/webpiecesServerBuilder/templateProject/WEBPIECESxAPPNAME/src/dist/public/favicon.ico does not exist. fileSysPath=public/favicon.ico
    at org.webpieces.router.impl.StaticRoute.<init>(StaticRoute.java:44)
    at org.webpieces.router.impl.model.R1RouterBuilder.addStaticRoute(R1RouterBuilder.java:89)
    at org.webpieces.router.impl.model.R1RouterBuilder.addStaticFile(R1RouterBuilder.java:82)
    at org.webpieces.router.api.routing.AbstractRoutes.addStaticFile(AbstractRoutes.java:38)
    at WEBPIECESxPACKAGE.base.AppRoutes.configure(AppRoutes.java:44)
    at org.webpieces.router.api.routing.AbstractRoutes.configure(AbstractRoutes.java:12)
    at org.webpieces.router.impl.RouteLoader.loadAllRoutes(RouteLoader.java:171)
    at org.webpieces.router.impl.RouteLoader.loadImpl(RouteLoader.java:114)
    at org.webpieces.router.impl.RouteLoader.load(RouteLoader.java:73)
    at org.webpieces.router.impl.ProdRouterService.start(ProdRouterService.java:49)
    at org.webpieces.webserver.impl.WebServerImpl.startAsync(WebServerImpl.java:68)
    at org.webpieces.webserver.impl.WebServerImpl.startSync(WebServerImpl.java:54)
    at WEBPIECESxPACKAGE.Server.start(Server.java:232)
    at WEBPIECESxPACKAGE.TestLesson1Json.setUp(TestLesson1Json.java:73)

然而,当我在if语句的程序中放入一个断点时,我会在存在检查之前和之后使用此结果执行ls -la命令(即它存在就好了)

[08:22][ruby-1.9.3][dhiller:/Library/Workflow/webpieces(master)]$ ls -la /Library/Workflow/webpieces/webserver/webpiecesServerBuilder/templateProject/WEBPIECESxAPPNAME/src/dist/public/favicon.ico
-rwxr-xr-x  1 dhiller  wheel  1150 Jul  4 09:31 /Library/Workflow/webpieces/webserver/webpiecesServerBuilder/templateProject/WEBPIECESxAPPNAME/src/dist/public/favicon.ico
[08:22][ruby-1.9.3][dhiller:/Library/Workflow/webpieces(master)]$

而不是新的File,我尝试了这个,这对任何一个都无济于事

private File createFile(String fileSystemPath2) {
    String[] split = fileSystemPath2.split("/");
    File tmp = new File(split[0]);
    for(int i = 1; i < split.length; i++) {
        tmp = new File(tmp, split[i]);
    }
    return tmp;
}

我在jdk 1.8.0_111和mac 10.11.6上。有一点工作就是将user.dir附加到文件的开头,这样就像

String userDir = System.getProperty("user.dir")
File f = new File(userDir, systemPath)

为什么我需要这样做呢?这看起来很奇怪,因为我之前可以发誓这个有效吗?

2 个答案:

答案 0 :(得分:0)

好吧,你需要将用户主目录附加到该路径,因为否则它不是绝对路径,只有当它位于文件夹中时,你的应用程序才能找到它,哪个路径可以解决(在你的情况下在用户家中)。

答案 1 :(得分:0)

好吧,我想出来了另外一个问题。

我修改了user.dir系统属性,但这显然会破坏相对文件的实际工作(至少在jdk1.8.0_111中)。即。只要文件只相对于原始user.dir,它就可以工作。不幸的是,intellij选择,gradle选择和eclipse选择的user.dir都是不一致的:(所以我想我会对齐它们并修改user.dir所以一切都会工作.... ooops,错误。这不起作用。

我在接下来的问题上添加了这个问题,我看到的是修剪版本。

user.dir property broken on OSX jdk 1.8.0_111? how about other OS, versions?