file.exists(),明明文件存在,10秒内都返回flase,10秒后返回true

long startTime = System.currentTimeMillis();

File file = new File(“\\192.168.1.234\aa\bb\test.txt”); //文件现在不存在,会在1秒后创建

while (!file.exists()) {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println("耗时" + (endTime - startTime)); //稳定打印 耗时10115左右


很普通的代码,局域网共享文件夹内拿文件,在程序刚运行时文件不存在的,运行1秒后共享文件夹所在电脑的程序创建test.txt文件,而在我这代码里跑出稳定的10秒后才退出while循环,正常应该跑1秒就退出循环才对,打印过一直返回flase,而我看着文件是存在的。判断方法试过file.getAbsoluteFile().exists()和file.isFile()和循环内写file = new File(“\\192.168.1.234\aa\bb\test.txt”);都不好使结果都一样,不希望用System.setProperty搞(我也没试过行不行,百度说的,但看着恶心)。路径和网络绝对没问题的。能有解决方法吗?

不要使用File操作远程的文件

最后一行代码前加一句long endTime = System.currentTimeMillis();

new File(“\\192.168.1.234\aa\bb\test.txt”); 只是生成了对象

file.createNewFile()才是创建文件...
 还有,就是你错用了 Thread.sleep(100);
 这个方法似乎是这样.....           while循环走了 10次没错...
 但是 它不是 第1秒执行一次,  第2秒执行一次
 是 在1秒内 执行了 10次, 然后等待了9秒...
 你可以进while循环 打一下时间..看一看...我不知道我说的对不对...
 反正你线程肯定错用了..

我是要去读取文件的,先做判断文件是不是存在,创建文件是在192.168.1.234那边的机子执行的,不是我这个程序执行,我这个程序不需要创建文件

什么叫1秒执行10次然后等待9秒,很简单的代码,不可能出现你说的。我的代码明显就是每0.1秒执行1次,直到文件存在才退出循环,等了我10秒就是他执行了100次

 那程序就跑了这么长时间...你换个CPU?...

艾玛,跟CPU无关,低配电脑都能随便跑的代码好吧,java跑这个压根不费什么东西

你把sleep 调低一点...看看什么情况呢... sleep(10)

一样的大哥。。跑多少秒是while循环的条件!file.exists()定的,我在循环内输出过file.exists()一直是flase,和sleep睡眠多少毫秒无关。我按你说的改成10,最后输出耗时10039,一样是10秒,这10秒关键不是sleep,是file.exists()

 那就问一下搞局域网的大哥...有没有设置什么连接设置...

java的File类只能在本机好使,在局域网就会出现我说的问题(文件实际存在但好一段时间都返回flase),和局域网和网络问题无关。。局域网和网络都很好没问题,有问题就连都连不上了

就是局域网读取文件速度慢啊...

ping过去延迟1ms怎么可能慢,是FIle类的问题。

文件判断存在后,我读取东西是飞速的

我直接不用判断文件存在,直接sleep(3000),直接进入读取文件,总耗时3001秒

网络是没任何问题的,但我不想用直接读取文件来做判断条件,就是这个判断是否存在的这个方法很诡异的返回flase,有没有解决办法

又试了个判断文件是否可读,!Files.isReadable(file.toPath()),还是10秒+,好无语。文件存在时判断状态各种不行要搞好久,直接读就可以,但直接读来做判断这代码就很恶心了

你在Thread.sleep(100)之后输出一个从0开始的累加数,看看执行了多少次循环,才能搞清楚是线程的问题还是网络的问题。个人感觉线程的问题可能性大一些

Thread.sleep(100)输出0开始的++count,输出到最后是74,退出循环后输出耗时10093

那就是说它在循环里就执行了7.4秒左右,问题出在线程上,稍等,我想想

我还是觉得在判断条件上,,跟线程怎么想都没关系。。明明文件在第1秒就出现了,文件存在后判断条件判断60+次都还是flase,这非常诡异。

网上说File只在本机好使,所以我觉得这应该是必然问题,你如果有2台电脑应该也会出现我这种情况。我只想有没有什么办法准确判断他存在。。SmbFile别推给我,,研究过2天都神之不好使才直接用的File。。

那你试一下换一种循环判断方式,比如:

while(true){


if(!file.exits()){

Thread.sleep(1000);

} else {

break;

}

}

++count跑了10次。耗时10155

同样的代码,不用局域网,放到192.168.1.234机子跑,只会跑1秒左右,文件出来立马能判断出他存在

就是File在局域网情况下会很诡异

FIle类

你把对象创建到循环中,也就是:

while(true){


File file = new File(“....”);


if(!file.exits()){

Thread.sleep(1000);

} else {

break;

}

}

结果一样

如果说本机执行1秒钟的话,那就是两台机器的局域网延迟导致的了

但是判断文件存在,10秒返回flase。但如果我跳过这判断文件存在的步骤,在睡眠3秒后直接读取他内容,是没问题的,读取内容只耗时1毫秒

ping那机子也就1ms,局域网非常顺溜的,我觉得不存在什么延迟问题

直接读取和输出都很好使,就查看状态很诡异。SmbFile各种姿势都不好使而且麻烦,有方法解决File问题或者别的东西推荐吗?除了SmbFile