linux下java File.exists() 正常情况下返回值是false 是什么原因?
Tofloor
poster avatar
suxuanhua
deepin
2017-11-22 09:56
Author
本帖最后由 suxuanhua 于 2017-11-22 02:06 编辑




今天打算更新个人的JavaWeb小项目,项目在 win10 tomcat 中部署能正常运行。
但是打包成 上传到 腾讯云 UbuntuServer 16.04,解压,把项目根目录中的所有文件,放到 tomcat ROOT目录中,将 ROOT目录中原有的文件删除。
(说一下放ROOT的原因吧:刚用IDEA的时候没设置好,导致链接跳转都不包含项目名,懒得修改,就直接替换ROOT目录)
运行tomcat 之后,项目发生错误(如图),经过几个钟的排查之后,
发现 Java 的 exists() 在 linux 下 ,就算通过文件路径找到了文件,并获取了文件名,返回值还是false。win 则是正常的的true。

网上查了之后,看到百科这么一篇文章:https://baike.baidu.com/item/file_exists/357436?fr=aladdin

文章说,file_exists 需要检测的父级文件夹权限,不是 777 会返回false 。
虽然文章中的是php ,应该和 Java 的exists() 相同。

想问一下这种情况Java 要怎么解决,是试过将整个项目、tomcat都chmod 777 了都还是不行。


贴代码://通过这种方式,在static 方法内获得项目的classes 目录,让后通过Properties 加载 .properties 配置文件。


            String path = new Object() {
                public String getPath() {
                    //加"/"表示当前项目根目录,不加表示当前运行类的目录
                    return this.getClass().getResource(PropertiesfilePath).getPath();

                }
            }.getPath().substring(1);


            //显示获得的地址。
            System.out.println ("Stitic method new Object 获得的地址:"+path);//正常获取

            file = new File (path+"BOLOMI.properties");
            System.out.println ("文件名是:"+file.getName ());//正常获取

            //返回值是false
            boolean b = file.exists ();////////////////////////有BUG,linux判断错误,该方法返回值有问题。可能原因:如果文件夹权限不是777返回的都是false

            System.out.println("exists 返回值是:"+b);

            if (b){  //判断不通过


大神!!!!!快就火呀。。。。。。


Reply Favorite View the author
All Replies
avatar
suxuanhua
deepin
2017-11-22 10:05
#1
https://bbs.deepin.org/user/48640 帖子编辑的插入代码有bug,插入时正常,发布帖子之后,插入的代码值显示一行。。。
Reply View the author
avatar
jiuxian
deepin
2017-11-22 16:49
#2
你Windows跟Linux的目录结构都不一样,代码改了没?
Reply View the author
avatar
bnbvb
deepin
2017-11-22 17:23
#3
本帖最后由 bnbvb 于 2017-11-22 09:38 编辑

是不是path那个substring(1)把opt前面的根目录给干掉了


做了个实验,/etc权限也不是777,/etc/profile是能够正确分辨的
Reply View the author
avatar
134******40
deepin
2017-11-22 18:01
#4
你哪怕获取了文件名,依旧不能证明文件存在。因为你已经指定了文件路径,这就说你默认已经给了其一个文件名了。
Reply View the author
avatar
javim
deepin
2017-11-22 18:19
#5
path不对吧
Reply View the author
avatar
suxuanhua
deepin
2017-11-22 18:42
#6
https://bbs.deepin.org/post/148730
你Windows跟Linux的目录结构都不一样,代码改了没?

改了,直接修改properties配置的,就是获取不到该文件中的内容,整个项目没办法正常运行:
BOLOMI_PostList=/BOLOMI_Files/XML/
BOLOMI_Files=/BOLOMI_Files/
BOLOMI_PostFiles=/BOLOMI_Files/PostFiles/
Reply View the author
avatar
suxuanhua
deepin
2017-11-22 18:44
#7
https://bbs.deepin.org/post/148730
你哪怕获取了文件名,依旧不能证明文件存在。因为你已经指定了文件路径,这就说你默认已经给了其一个文件名 ...

刚看了以下源代码,的确是我给了个文件名。。。。
可是我在那个路径下文件是存在的 ....
Reply View the author
avatar
suxuanhua
deepin
2017-11-22 18:45
#8
https://bbs.deepin.org/post/148730
是不是path那个substring(1)把opt前面的根目录给干掉了

有可能,我去修改试一下。
Reply View the author
avatar
134******40
deepin
2017-11-22 18:49
#9
https://bbs.deepin.org/post/148730
刚看了以下源代码,的确是我给了个文件名。。。。,
可是我在那个路径下文件是存在的 .... ...

不可能路径正确,我在linux使用java开发从来没有碰到这种问题。
问题发现了,可能出在subSsring(1)上:
将打印结果贴过来,相信很好判断。
Reply View the author
avatar
suxuanhua
deepin
2017-11-22 18:50
#10

java 获取path 是我最烦的一件事。。。。
Reply View the author
avatar
suxuanhua
deepin
2017-11-22 18:52
#11
https://bbs.deepin.org/post/148730
不可能路径正确,我在linux使用java开发从来没有碰到这种问题。
问题发现了,可能出在subSsring(1)上:
将 ...

刚看了一下前面发的图片,“ /” 好像是被substring(1) 啃掉了。。。。
Reply View the author
avatar
134******40
deepin
2017-11-22 18:56
#12
https://bbs.deepin.org/post/148730
java 获取path 是我最烦的一件事。。。。

刚刚没看到图,手机看起来不方便。
刚刚看到打印信息了。在opt前面少了个/,这就是错误所在。问题就出在substring(1)上,这个将前面的/过滤掉了,所以绝对路径就变成了相对路径。当然找不到了。
-------------------------------------
囧rz,前面已经有人指出来了,我这回答就算了。
Reply View the author
avatar
suxuanhua
deepin
2017-11-22 19:26
#13
https://bbs.deepin.org/post/148730
刚刚没看到图,手机看起来不方便。
刚刚看到打印信息了。在opt前面少了个/,这就是错误所在。问题就出在s ...

哈哈 ..... 加substring 的原因是,在 win 下获取到的目录会多个“/”,比如/E:/xx/mm,没想到放到linux  下就直接把Linux 的根给啃掉了。。。
Reply View the author
avatar
134******40
deepin
2017-11-22 19:39
#14
https://bbs.deepin.org/post/148730
哈哈 ..... 加substring 的原因是,在 win 下获取到的目录会多个“/”,比如/E:/xx/mm,没想到放到linux  ...

其实在Windows下,路径前面有/也不影响后面的路径识别。java很智能的,能自动根据系统识别路径。
Reply View the author