Java對文件進行基本操作案例講解
File文件類
- java.io.File是文件和目錄的重要類(JDK6及以前是唯一)
- 目錄也使用File類進行表示
- File類與操作系統(tǒng)無關(guān),但會受到操作系統(tǒng)的權(quán)限限制
- 常用方法
- createNewFile , delete , exists , getAbsolutePath , getName , getParent , getPath
- isDirectory , isFile , length , listFiles , mkdir , mkdirs
- File不涉及到具體的文件內(nèi)容、只會涉及屬性
public static void main(String[] args) { // 創(chuàng)建目錄 File directory = new File("D:/temp"); boolean directoryDoesNotExists = ! directory.exists(); if (directoryDoesNotExists) { // mkdir是創(chuàng)建單級目錄 // mkdirs是連續(xù)創(chuàng)建多級目錄 directory.mkdirs(); } // 創(chuàng)建文件 File file = new File("D:/temp/test.txt"); boolean fileDoesNotExsits = ! file.exists(); if (fileDoesNotExsits) { try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } // 遍歷directory下的所有文件消息 File[] files = directory.listFiles(); for (File file1 : files) { System.out.println(file1.getPath()); } }
運行結(jié)果:
D:\temp\test.txt
Java NIO
Java 7提出的NIO包,提出新的文件系統(tǒng)類Path , Files , DirectoryStream , FileVisitor , FileSystem是對java.io.File的有益補充文件復(fù)制和移動文件相對路徑遞歸遍歷目錄遞歸刪除目錄
Path類
public static void main(String[] args) { // Path和java.io.File基本類似 Path path = FileSystems.getDefault().getPath("D:/temp", "abc.txt"); // D:/ 返回1 D:/temp 返回2 System.out.println(path.getNameCount()); // 用File的toPath()方法獲取Path對象 File file = new File("D:/temp/abc.txt"); Path path1 = file.toPath(); System.out.println(path.compareTo(path1)); // 結(jié)果為0 說明兩個path相等 // 獲取Path方法三 Path path3 = Paths.get("D:/temp", "abc.txt"); // 判斷文件是否可讀 System.out.println("文件是否可以讀取: " + Files.isReadable(path)); }
Files類
public static void main(String[] args) { // 移動文件 moveFile(); // 訪問文件屬性 fileAttributes(); // 創(chuàng)建目錄 createDirectory(); } private static void createDirectory() { Path path = Paths.get("D:/temp/test"); try { // 創(chuàng)建文件夾 if (Files.notExists(path)) { Files.createDirectory(path); } else { System.out.println("文件夾創(chuàng)建失敗"); } Path path2 = path.resolve("a.java"); Path path3 = path.resolve("b.java"); Path path4 = path.resolve("c.txt"); Path path5 = path.resolve("d.jpg"); Files.createFile(path2); Files.createFile(path3); Files.createFile(path4); Files.createFile(path5); // 不帶條件的遍歷輸出 DirectoryStream<Path> listDirectory = Files.newDirectoryStream(path); for (Path path1 : listDirectory) { System.out.println(path1.getFileName()); } // 創(chuàng)建一個帶有過濾器,過濾文件名以java txt結(jié)尾的文件 DirectoryStream<Path> pathsFilter = Files.newDirectoryStream(path, "*.{java,txt}"); for (Path item : pathsFilter) { System.out.println(item.getFileName()); } } catch (Exception e) { e.printStackTrace(); } } @SuppressWarnings("all") private static void fileAttributes() { Path path = Paths.get("D:/temp"); // 判斷是否是目錄 System.out.println(Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)); try { // 獲取文件的基礎(chǔ)屬性 BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class); // 判斷是否是目錄 System.out.println(attributes.isDirectory()); // 獲取文件最后修改時間 System.out.println(new Date(attributes.lastModifiedTime().toMillis()).toLocaleString()); } catch (Exception e) { e.printStackTrace(); } } private static void moveFile() { Path from = Paths.get("D:/temp", "text.txt"); // 將文件移動到D:/temp/test/text.txt, 如果目標(biāo)文件以存在則替換 Path to = from.getParent().resolve("test/text.txt"); try { // 文件大小bytes System.out.println(Files.size(from)); // 調(diào)用文件移動方法,如果目標(biāo)文件已存在則替換 Files.move(from, to, StandardCopyOption.REPLACE_EXISTING); } catch (Exception e) { e.printStackTrace(); } }
遞歸遍歷查找指定文件
public class Demo2 { public static void main(String[] args) { // 查找以.jpg結(jié)尾的 String ext = "*.jpg"; Path fileTree = Paths.get("D:/temp/"); Search search = new Search(ext); EnumSet<FileVisitOption> options = EnumSet.of(FileVisitOption.FOLLOW_LINKS); try { Files.walkFileTree(fileTree, options, Integer.MAX_VALUE, search); } catch (IOException e) { e.printStackTrace(); } } } class Search implements FileVisitor { private PathMatcher matcher; public Search(String ext) { this.matcher = FileSystems.getDefault().getPathMatcher("glob:" + ext); } public void judgeFile(Path file) throws IOException { Path name = file.getFileName(); if (name != null && matcher.matches(name)) { // 文件名匹配 System.out.println("匹配的文件名: " + name); } } // 訪問目錄前調(diào)用 @Override public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) throws IOException { return FileVisitResult.CONTINUE; } // 訪問文件時調(diào)用 @Override public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException { judgeFile((Path) file); return FileVisitResult.CONTINUE; } // 訪問文件失敗后調(diào)用 @Override public FileVisitResult visitFileFailed(Object file, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } // 訪問一個目錄后調(diào)用 @Override public FileVisitResult postVisitDirectory(Object dir, IOException exc) throws IOException { System.out.println("postVisit: " + (Path) dir); return FileVisitResult.CONTINUE; } }
運行結(jié)果:
匹配的文件名: d.jpg
postVisit: D:\temp\test
postVisit: D:\temp
Java的IO包
Java讀寫文件,只能以數(shù)據(jù)流的形式進行讀寫java.io包中節(jié)點類:直接對文件進行讀寫包裝類:1、轉(zhuǎn)換類:字節(jié) / 字符 / 數(shù)據(jù)類型的轉(zhuǎn)化類 。2、裝飾類:裝飾節(jié)點類。
節(jié)點類
直接操作文件類InputStream,OutStream(字節(jié)) FileInputStream , FileOutputStream Reader , Writer(字符) FileReader , FileWriter
轉(zhuǎn)換類
從字符到字節(jié)之間的轉(zhuǎn)化InputStreamReader: 文件讀取時字節(jié),轉(zhuǎn)化為Java能理解的字符OutputStreamWriter: Java將字符轉(zhuǎn)化為字節(jié)輸入到文件中
裝飾類
DataInputStream , DataOutputStream :封裝數(shù)據(jù)流BufferedInputStream ,BufferOutputStream:緩存字節(jié)流BufferedReader , BufferedWriter:緩存字符流
文本文件的讀寫
寫操作
public static void main(String[] args) { writeFile(); } public static void writeFile(){ try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:/temp/demo3.txt")))) { bw.write("hello world"); bw.newLine(); bw.write("Java Home"); bw.newLine(); } catch (Exception e) { e.printStackTrace(); } }
Demo3.txt文件內(nèi)容
hello world
Java Home
讀操作
public static void main(String[] args) { readerFile(); } private static void readerFile() { String line = ""; try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("D:/temp/demo3.txt")))) { while ((line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } }
運行結(jié)果:
hello world
Java Home
二進制文件讀寫java
public static void main(String[] args) { writeFile(); } private static void writeFile() { try (DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:/temp/test.dat")))) { dos.writeUTF("hello"); dos.writeUTF("hello world is test bytes"); dos.writeInt(20); dos.writeUTF("world"); } catch (Exception e) { e.printStackTrace(); } }
文件內(nèi)容
hellohello world is test bytes world
讀操作
public static void main(String[] args) { readFile(); } private static void readFile() { try (DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("D:/temp/test.dat")))) { System.out.println(in.readUTF() + in.readUTF() + in.readInt() + in.readUTF()); } catch (Exception e) { e.printStackTrace(); } }
運行結(jié)果:
hellohello world is test bytes20world
ZIP文件的讀寫
- zip文件操作類:java.util.zip包中
- java.io.InputStream , java.io.OutputStream的子類
- ZipInputStream , ZipOutputStream壓縮文件輸入 / 輸出流
- ZipEntry壓縮項
多個文件壓縮
// 多個文件壓縮 public static void main(String[] args) { zipFile(); } public static void zipFile() { File file = new File("D:/temp"); File zipFile = new File("D:/temp.zip"); FileInputStream input = null; try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) { // 添加注釋 zos.setComment(new String("多個個文件壓縮".getBytes(),"UTF-8")); // 壓縮過程 int temp = 0; // 判斷是否為文件夾 if (file.isDirectory()) { File[] listFile = file.listFiles(); for (int i = 0; i < listFile.length; i++) { // 定義文件的輸出流 input = new FileInputStream(listFile[i]); // 設(shè)置Entry對象 zos.putNextEntry(new ZipEntry(file.getName() + File.separator + listFile[i].getName() )); System.out.println("正在壓縮: " + listFile[i].getName()); // 讀取內(nèi)容 while ((temp = input.read()) != -1) { // 壓縮輸出 zos.write(temp); } // 關(guān)閉輸入流 input.close(); } } } catch (Exception e) { e.printStackTrace(); } }
注意:壓縮的文件夾不能有子目錄,否則會報FileNotFoundException: D:\temp\test (拒絕訪問。),這是由于input = new FileInputStream(listFile[i]);讀取的文件類型是文件夾導(dǎo)致的
多個文件解壓縮
// 多個文件解壓縮 public static void main(String[] args) throws Exception{ // 待解壓的zip文件,需要在zip文件上構(gòu)建輸入流,讀取數(shù)據(jù)到Java中 File file = new File("C:\\Users\\Wong\\Desktop\\test.zip"); // 輸出文件的時候要有文件夾的操作 File outFile = null; // 實例化ZipEntry對象 ZipFile zipFile = new ZipFile(file); // 定義解壓的文件名 OutputStream out = null; // 定義輸入流,讀取每個Entry InputStream input = null; // 每一個壓縮Entry ZipEntry entry = null; // 定義壓縮輸入流,實例化ZipInputStream try (ZipInputStream zipInput = new ZipInputStream(new FileInputStream(file))) { // 遍歷壓縮包中的文件 while ((entry = zipInput.getNextEntry()) != null) { System.out.println("解壓縮 " + entry.getName().replaceAll("/", "") + " 文件"); // 定義輸出的文件路徑 outFile = new File("D:/" + entry.getName()); boolean outputDirectoryNotExsits = !outFile.getParentFile().exists(); // 當(dāng)輸出文件夾不存在時 if (outputDirectoryNotExsits) { // 創(chuàng)建輸出文件夾 outFile.getParentFile().mkdirs(); } boolean outFileNotExists = !outFile.exists(); // 當(dāng)輸出文件不存在時 if (outFileNotExists) { if (entry.isDirectory()) { outFile.mkdirs(); } else { outFile.createNewFile(); } } boolean entryNotDirctory = !entry.isDirectory(); if (entryNotDirctory) { input = zipFile.getInputStream(entry); out = new FileOutputStream(outFile); int temp = 0; while ((temp = input.read()) != -1) { out.write(temp); } input.close(); out.close(); System.out.println("解壓縮成功"); } } } catch (Exception e) { e.printStackTrace(); } }
到此這篇關(guān)于Java對文件進行基本操作案例講解的文章就介紹到這了,更多相關(guān)Java文件基本操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn)
本文主要介紹了Java實現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05SpringBoot之整合MyBatis實現(xiàn)CRUD方式
這篇文章主要介紹了SpringBoot之整合MyBatis實現(xiàn)CRUD方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08Java中break、continue、return語句的使用區(qū)別對比
這篇文章主要介紹了Java中break、continue、return語句的使用區(qū)別對比,本文用非常清爽簡明的語言總結(jié)了這三個關(guān)鍵字的使用技巧,并用一個實例對比使用結(jié)果,需要的朋友可以參考下2015-06-06SpringBoot擴展SpringMVC原理并實現(xiàn)全面接管
這篇文章主要介紹了SpringBoot擴展SpringMVC原理并實現(xiàn)全面接管,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11原生java代碼實現(xiàn)碼云第三方驗證登錄的示例代碼
這篇文章主要介紹了原生java代碼實現(xiàn)碼云第三方驗證登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04MyBatis中如何接收String類型的參數(shù)實現(xiàn)
這篇文章主要介紹了MyBatis中如何接收String類型的參數(shù)實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Spring Boot中使用AOP統(tǒng)一處理web層異常的方法
這篇文章主要介紹了Spring Boot中使用AOP統(tǒng)一處理web層異常的相關(guān)資料,需要的朋友可以參考下2018-03-03Spring?Task任務(wù)調(diào)度的實現(xiàn)示例
本文主要介紹了Spring?Task任務(wù)調(diào)度的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06