
本文是Java IO總結系列篇的第5篇,前篇的訪問地址如下:
- 總結java中創建并寫檔案的5種方式-JAVA IO基礎總結第一篇
- 總結java從檔案中讀取資料的6種方法-JAVA IO基礎總結第二篇
- 總結java創建檔案夾的4種方法及其優缺點-JAVA IO基礎總結第三篇
- 總結java中洗掉檔案或檔案夾的7種方法-JAVA IO基礎總結第四篇
很多朋友在看我的《java IO總結系列》之前覺得創建檔案、檔案夾洗掉檔案這些基礎操作真的是太簡單了,但看了我的文章之后,有小伙伴找到我說:“沒想到這么基礎的知識里面還有這么多的門門道道,用起來很容易,真的用好也不容易”,哪一個方法用起來簡單,哪一個方法在例外處理方面更加健壯,不看我的總結你可能還真的不知道,
有興趣的了解更多的小伙伴可以關注我,我會持續的寫這一系列的文章,如果您覺得我的文章對您有幫助,請幫忙點個贊,您的支持是我不竭的創作動力!
那我們下面就來為大家介紹本篇的內容:檔案拷貝(重命名)與剪切的5種方法,首先我們來理解以下下面的幾個概念:
- 檔案拷貝:將檔案從一個檔案夾復制到另一個檔案夾
- 檔案剪切:將檔案從當前檔案夾,移動到另一個檔案夾
- 檔案重命名:將檔案在當前檔案夾下面改名(也可以理解為將檔案剪切為當前檔案夾下面的另一個檔案)
一、檔案拷貝
傳統IO中的檔案copy的方法,使用輸入輸出流,實際上就是重新創建并寫入一個檔案,如果目標檔案已經存在,就覆寫掉它,重新創建一個檔案并寫入資料,這種方式不夠友好,覆寫掉原有檔案沒有給出任何提示,有可能導致原有資料的丟失,
@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的方法,使用方式簡單,當目標檔案已經存在的時候會拋出FileAlreadyExistsException ,當源檔案不存在的時候拋出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);
}
如果在目標檔案已經存在的情況下,你不想拋出FileAlreadyExistsException ,而是去覆寫它,也可以靈活的選擇使用下面的選項
- StandardCopyOption.REPLACE_EXISTING 來忽略檔案已經存在的例外,如果存在就去覆寫掉它
//如果目標檔案存在就替換它
Files.copy(fromFile, toFile, StandardCopyOption.REPLACE_EXISTING);
- StandardCopyOption.COPY_ATTRIBUTES copy檔案的屬性,最近修改時間,最近訪問時間等資訊,不僅copy檔案的內容,連檔案附帶的屬性一并復制
CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES //copy檔案的屬性,最近修改時間,最近訪問時間等
};
Files.copy(fromFile, toFile, options);
二、檔案重命名
NIO中可以使用Files.move方法在同一個檔案夾內移動檔案,并更換名字,當目標檔案已經存在的時候,同樣會有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);
}
下文中的實作方法和上面代碼的效果是一樣的,resolveSibling作用是將source檔案的父路徑與引數檔案名合并為一個新的檔案路徑,
resolve系列函式在windows和linux等各種系統處理路徑分隔符號、路徑與檔案名合并等,比自己手寫代碼去處理不同作業系統的路徑分隔符號、路徑與檔案名合并有更好的作業系統兼容性,
@Test
void testRenameFile2() throws IOException {
Path source = Paths.get("D:\\data\\test\\newFile.txt");
//這種寫法就更加簡單,兼容性更好
Files.move(source, source.resolveSibling("renameFile.txt"));
}
傳統IO中使用File類的renameTo方法重命名,失敗了就回傳false,沒有任何例外拋出,你不會知道你失敗的原因是什么,是因為源檔案不存在導致失敗?還是因為目標檔案已經存在導致失敗?所以這種方法筆者不建議使用,
@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的目標檔案夾不存在或源檔案不存在,都會拋出NoSuchFileException
@Test
void testMoveFile() throws IOException {
Path fromFile = Paths.get("D:\\data\\test\\newFile.txt"); //檔案
Path anotherDir = Paths.get("D:\\data\\test\\anotherDir"); //目標檔案夾
Files.createDirectories(anotherDir);
Files.move(fromFile, anotherDir.resolve(fromFile.getFileName()),
StandardCopyOption.REPLACE_EXISTING);
}
resolve函式是決議anotherDir路徑與引數檔案名進行合并為一個新的檔案路徑,
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客,
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! ,另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注,
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前后端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20866.html
標籤:Java
