您好,登錄后才能下訂單哦!
這篇文章主要講解了“java中文件拷貝剪切的方式有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“java中文件拷貝剪切的方式有哪些”吧!
傳統(tǒng)IO中的文件copy的方法,使用輸入輸出流,實際上就是重新創(chuàng)建并寫入一個文件。如果目標(biāo)文件已經(jīng)存在,就覆蓋掉它,重新創(chuàng)建一個文件并寫入數(shù)據(jù)。這種方式不夠友好,覆蓋掉原有文件沒有給出任何提示,有可能導(dǎo)致原有數(shù)據(jù)的丟失。
@Test void testCopyFile1() throws IOException { File fromFile = new File("D:\\data\\test\\newFile.txt"); File toFile = new File("D:\\data\\test2\\copyedFile.txt"); try(InputStream inStream = new FileInputStream(fromFile); OutputStream outStream = new FileOutputStream(toFile);) { byte[] buffer = new byte[1024]; int length; while ((length = inStream.read(buffer)) > 0) { outStream.write(buffer, 0, length); outStream.flush(); } } }
Java NIO中文件copy的方法,使用方式簡單。當(dāng)目標(biāo)文件已經(jīng)存在的時候會拋出FileAlreadyExistsException ,當(dāng)源文件不存在的時候拋出NoSuchFileException,針對不同的異常場景給出不同的Exception,更有利于我們寫出健壯性更好的程序。
@Test void testCopyFile2() throws IOException { Path fromFile = Paths.get("D:\\data\\test\\newFile.txt"); Path toFile = Paths.get("D:\\data\\test2\\copyedFile.txt"); Files.copy(fromFile, toFile); }
如果在目標(biāo)文件已經(jīng)存在的情況下,你不想拋出FileAlreadyExistsException ,而是去覆蓋它,也可以靈活的選擇使用下面的選項
StandardCopyOption.REPLACE_EXISTING 來忽略文件已經(jīng)存在的異常,如果存在就去覆蓋掉它
//如果目標(biāo)文件存在就替換它 Files.copy(fromFile, toFile, StandardCopyOption.REPLACE_EXISTING);
StandardCopyOption.COPY_ATTRIBUTES copy文件的屬性,最近修改時間,最近訪問時間等信息,不僅copy文件的內(nèi)容,連文件附帶的屬性一并復(fù)制
CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES //copy文件的屬性,最近修改時間,最近訪問時間等 }; Files.copy(fromFile, toFile, options);
NIO中可以使用Files.move方法在同一個文件夾內(nèi)移動文件,并更換名字。當(dāng)目標(biāo)文件已經(jīng)存在的時候,同樣會有FileAlreadyExistsException,也同樣可以使用StandardCopyOption去處理該異常。
@Test void testRenameFile() throws IOException { Path source = Paths.get("D:\\data\\test\\newFile.txt"); Path target = Paths.get("D:\\data\\test\\renameFile.txt"); //REPLACE_EXISTING文件存在就替換它 Files.move(source, target,StandardCopyOption.REPLACE_EXISTING); }
下文中的實現(xiàn)方法和上面代碼的效果是一樣的,resolveSibling作用是將source文件的父路徑與參數(shù)文件名合并為一個新的文件路徑。
resolve系列函數(shù)在windows和linux等各種系統(tǒng)處理路徑分隔符號、路徑與文件名合并等,比自己手寫代碼去處理不同操作系統(tǒng)的路徑分隔符號、路徑與文件名合并有更好的操作系統(tǒng)兼容性。
@Test void testRenameFile2() throws IOException { Path source = Paths.get("D:\\data\\test\\newFile.txt"); //這種寫法就更加簡單,兼容性更好 Files.move(source, source.resolveSibling("renameFile.txt")); }
傳統(tǒng)IO中使用File類的renameTo方法重命名,失敗了就返回false,沒有任何異常拋出。你不會知道你失敗的原因是什么,是因為源文件不存在導(dǎo)致失???還是因為目標(biāo)文件已經(jīng)存在導(dǎo)致失???所以這種方法筆者不建議使用。
@Test void testRenameFile3() throws IOException { File source = new File("D:\\data\\test\\newFile.txt"); boolean succeeded = source.renameTo(new File("D:\\data\\test\\renameFile.txt")); System.out.println(succeeded); //失敗了false,沒有異常 }
文件剪切實際上仍然是Files.move,如果move的目標(biāo)文件夾不存在或源文件不存在,都會拋出NoSuchFileException
@Test void testMoveFile() throws IOException { Path fromFile = Paths.get("D:\\data\\test\\newFile.txt"); //文件 Path anotherDir = Paths.get("D:\\data\\test\\anotherDir"); //目標(biāo)文件夾 Files.createDirectories(anotherDir); Files.move(fromFile, anotherDir.resolve(fromFile.getFileName()), StandardCopyOption.REPLACE_EXISTING); }
resolve函數(shù)是解析anotherDir路徑與參數(shù)文件名進(jìn)行合并為一個新的文件路徑。
感謝各位的閱讀,以上就是“java中文件拷貝剪切的方式有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對java中文件拷貝剪切的方式有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。