我使用以下代码编辑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,就好像它无法找到此文件一样。 虽然该文件仅存在于正确的目录中。
答案 0 :(得分:0)
renameTo 的行为:
此方法行为的许多方面都是固有的 依赖于平台:重命名操作可能无法移动 从一个文件系统到另一个文件系统的文件,它可能不是原子的,而它 如果文件具有目标抽象路径名,则可能不会成功 已存在。应始终检查返回值以确保 重命名操作成功。
在您的情况下,首先您要删除oldFile
而不是将tmpFile
重命名为oldFileName
,这实际上是完美的,但是当您致电newFile.getAbsolutePath()
时会打印出tmpFile
因为Object newFile
仍然仅指旧路径。您需要重新创建File Object
才能访问重命名的File
。