3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
另請(qǐng)參見Files.move()JDK 7中的方法。
一個(gè)例子:
String fileName = "MyFile.txt";
try {
Files.move(new File(fileName).toPath(), new File(fileName).toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
} catch (IOException ex) {
Logger.getLogger(SomeClass.class.getName()).log(Level.SEVERE, null, ex);
}

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
對(duì)于它的價(jià)值,還有一些其他概念:
在Windows上,
renameTo()
即使目標(biāo)目錄存在,即使它為空,似乎也會(huì)失敗。就像我在Linux上嘗試過的renameTo()
那樣,只要目標(biāo)為空,只要目標(biāo)存在,它就會(huì)成功,這使我感到驚訝。(顯然,我不應(yīng)該假設(shè)這種事情在所有平臺(tái)上都可以起作用;這正是Javadoc警告的。)
如果您懷疑可能存在一些揮之不去的文件鎖,請(qǐng)稍等片刻再進(jìn)行移動(dòng)/重命名可能會(huì)有所幫助。(在安裝程序/升級(jí)程序的某一點(diǎn)上,我們添加了一個(gè)“睡眠”操作和一個(gè)不確定的進(jìn)度條,持續(xù)了大約10秒鐘,因?yàn)槟承┪募赡軖熘?wù))。甚至可以執(zhí)行一個(gè)簡(jiǎn)單的重試機(jī)制try
renameTo()
,然后等待一段時(shí)間(可能逐漸增加),直到操作成功或達(dá)到某個(gè)超時(shí)為止。
就我而言,大多數(shù)問題似乎都可以通過兼顧以上兩者來解決,因此我們根本不需要進(jìn)行本機(jī)內(nèi)核調(diào)用或諸如此類的事情。

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
就我而言,這似乎是我自己的應(yīng)用程序中的死對(duì)象,該對(duì)象保留了該文件的句柄。因此,該解決方案對(duì)我有用:
for (int i = 0; i < 20; i++) {
if (sourceFile.renameTo(backupFile))
break;
System.gc();
Thread.yield();
}
優(yōu)點(diǎn):速度非???,因?yàn)闆]有Thread.sleep()帶有特定的硬編碼時(shí)間。
缺點(diǎn):20的限制是一些硬編碼的數(shù)字。在我所有的測(cè)試中,i = 1就足夠了。但可以肯定的是,我將其保留為20歲。
添加回答
舉報(bào)