在renameTo()上没有调用新文件

时间:2017-07-14 05:44:34

标签: java linux file-rename

我使用以下代码编辑linux上的文件OIMV2Migration.sh。

    String oldFileName = "OIMV2Migration.sh";//file to be edited
    String tmpFileName = "tmp_try.dat"; //new file containing changes
    BufferedReader br = null;
    BufferedWriter bw = null;
                  try {
                     br = new BufferedReader(new FileReader(oldFileName));
                     bw = new BufferedWriter(new FileWriter(tmpFileName));
                     String line;
                     while ((line = br.readLine()) != null) {
                        if (line.contains("SURBHI")) {
                           line = line.replace("SURBHI MITTAL" , "SURBHI GUPTA");}
                        bw.write(line+"\n");
                     }
                  } catch (Exception e) {
                     return;
                  } finally {
                     try {
                        if(br != null)
                           br.close();
                     } catch (IOException e) {
                        //
                     }
                     try {
                        if(bw != null)
                           bw.close();
                     } catch (IOException e) {
                        //
                     }}

                 //delete the old file
                  File oldFile = new File(oldFileName);;
                  oldFile.delete();
                 //rename the new file to old file        
                  File newFile = new File(tmpFileName);
                  System.out.println(newFile.getAbsolutePath());
                  Boolean success = newFile.renameTo(oldFile);
                  System.out.println(newFile.getAbsolutePath());

这里,文件正在正确更新,但newFile的绝对路径始终指向" tmp_try.dat,在renameTo()之前和执行renameTo()之后。

我从堆栈溢出链接知道文件实例的绝对路径没有改变,它保持不变。 但我的问题是我的系统idmlcm.sh中有另一个文件在内部调用OIMV2Migration.sh.But执行此方法后,idmlcm.sh无法调用OIMV2Migration.sh,就好像它无法找到此文件一样。 虽然该文件仅存在于正确的目录中。

1 个答案:

答案 0 :(得分:0)

根据JAVA Documentation

renameTo 的行为:

  

此方法行为的许多方面都是固有的   依赖于平台:重命名操作可能无法移动   从一个文件系统到另一个文件系统的文件,它可能不是原子的,而它   如果文件具有目标抽象路径名,则可能不会成功   已存在。应始终检查返回值以确保   重命名操作成功。

在您的情况下,首先您要删除oldFile而不是将tmpFile重命名为oldFileName,这实际上是完美的,但是当您致电newFile.getAbsolutePath()时会打印出tmpFile因为Object newFile仍然仅指旧路径。您需要重新创建File Object才能访问重命名的File