我知道这可能已经回答了一百万次了,但我所看到的一切都没有帮助我。这是我的代码:
for(File g: f.listFiles()){
for(File h : g.listFiles()){
try{
Scanner s = new Scanner(h);
String timestamp = s.next().split("[?]")[4];
File z = new File(h.getAbsolutePath().split("[.]")[0] + timestamp + h.getAbsolutePath().split("[.]")[1]);
boolean q = h.renameTo(z);
}catch(Exception e){
}
}
}
我已经检查过文件z是否存在而且不存在。我检查过文件h是否存在而且确实存在。我已经仔细检查过h是绝对路径。如果我打印z的绝对路径,我会得到正确的路径。 f中的目录或g中的文件都没有打开。由h表示的文件未打开。可能会在文件中设置一些标志或窗口不允许我的程序重命名它?
答案 0 :(得分:3)
我的猜测是你遇到了类似问题File deletion/moving failing
尝试将FileinputStream用于扫描仪
FileInputStream fin = new FileInputStream(h);
fin.open()
Scanner s = new Scanner(fin);
//do work
fin.close()
并在重命名之前关闭流
答案 1 :(得分:2)
renameTo的行为因平台而异。在一个平台上成功的操作可能在另一个平台上失败例如,在我的本地开发工作站(OS X)上,一切都按预期工作。在生产系统(Solaris)上,renameTo始终失败。当文件位于不同的分区时,我终于确定它失败了。显然情况并非如此,但它说明该方法可能会以意想不到的方式运行。
要获得一致的行为,请将数据复制到新文件,然后删除原始文件。
答案 2 :(得分:1)
我有一个几乎相同的问题。一些重命名案例成功,一些失败。对于那些失败的情况,我发现,源文件路径和目标文件路径不在同一文件系统中。在我的情况下,NTFS安装了另一个文件系统,目标文件将被移动到该文件系统。由于重命名功能的原始目的只是重命名一个名称,而不是移动相关文件的数据。如果源文件路径和目标文件路径都在不同的文件系统中,则某些版本的JVM将在某些平台上失败。实际上,它是java.io中的一个错误,Solaris已经在新版本中修复了这个错误。 祝你好运!
HappyForever,