Java 文件操作

文章目錄

  • Java 文件操作
    • 構造方法
    • 文件屬性操作
    • 文件內容操作
      • InputStream
      • Reader
      • OutputStream
      • Writer
    • 更多案例
      • 文件查找
      • 普通文件的復制

Java 文件操作

Java 中通過 java.io.File 類來對文件進行描述。

構造方法

構造方法說明
File(String pathname)通過路徑名字符串來創建 File 實例
File(String parent, String child)從父路徑名字符串和子路徑名字符串創建 File 實例
File(File parent, String child)從父抽象路徑名和子路徑名字符串創建 File 實例

注意:創建 File 實例不等于創建文件

文件屬性操作

方法說明
String getParent()返回父路徑名字符串
String getName()返回該抽象路徑名表示的文件或目錄的名稱
String getPath()將此抽象路徑名轉換為路徑名字符串
String getAbsolutePath()返回此抽象路徑名的絕對路徑名字符串
String getCanonicalPath()返回此抽象路徑名的規范路徑名字符串
boolean exists()測試此抽象路徑名表示的文件或目錄是否存在
boolean isDirectory()測試此抽象路徑名表示的文件是否為目錄
boolean isFile()測試此抽象路徑名表示的文件是否為普通文件
boolean createNewFile()當且僅當具有此名稱的文件還不存在時,原子地創建一個由該抽象路徑名命名的新的空文件。
boolean delete()刪除由該抽象路徑名表示的文件或目錄
void deleteOnExit()請求在虛擬機終止時刪除由該抽象路徑名表示的文件或目錄
String[] list()返回該抽象路徑名下的文件名
File[] listFiles()返回一個抽象路徑名數組,表示該抽象路徑名所表示的目錄中的文件
boolean mkdir()創建以此抽象路徑名命名的目錄
boolean mkdirs()創建以此抽象路徑名命名的目錄,如果必要,會創建中間目錄
boolean renameTo(File dest)重命名由該抽象路徑名表示的文件
boolean canRead()測試應用程序是否可以讀取由該抽象路徑名表示的文件
boolean canWrite()測試應用程序是否可以修改由該抽象路徑名表示的文件

示例:

public static void main(String[] args) throws IOException {File file = new File("d:/test.txt");System.out.println(file.getParent()); // d:\System.out.println(file.getName()); // test.txtSystem.out.println(file.getPath()); // d:\test.txtSystem.out.println(file.getAbsolutePath()); // d:\test.txtSystem.out.println(file.getCanonicalPath()); // D:\test.txt
}
public static void main(String[] args) throws IOException {File file = new File("helloworld.txt");System.out.println(file.exists()); // falseSystem.out.println(file.isDirectory()); // falseSystem.out.println(file.isFile()); // falseSystem.out.println("=============================");// 創建文件file.createNewFile();System.out.println(file.exists()); // trueSystem.out.println(file.isDirectory()); // falseSystem.out.println(file.isFile()); // true
}
public static void main(String[] args) {File file = new File("helloworld.txt");// 刪除文件file.delete();System.out.println(file.exists()); // false
}
public static void main(String[] args) throws IOException, InterruptedException {File file = new File("helloworld.txt");// 把文件創建回來file.createNewFile();// 在程序退出前刪除file.deleteOnExit();Thread.sleep(5000);System.out.println(file.exists()); // true
}
public static void main(String[] args) {// 創建目錄File file = new File("test");System.out.println(file.exists()); // falseSystem.out.println(file.isDirectory()); // falseSystem.out.println("========================");file.mkdir();System.out.println(file.exists()); // trueSystem.out.println(file.isDirectory()); // true
}
public static void main(String[] args) {// 創建多級目錄File file = new File("test/a/b/c");System.out.println(file.exists()); // falseSystem.out.println(file.isDirectory()); // falseSystem.out.println("========================");file.mkdirs();System.out.println(file.exists()); // trueSystem.out.println(file.isDirectory()); // true
}
public static void main(String[] args) throws IOException {// 文件重命名File file1 = new File("test1.txt");File file2 = new File("test2.txt");file1.createNewFile(); // 創建 test1.txtfile1.renameTo(file2); // 重命名成 test2.txt
}

文件內容操作

相關的類:

  • 字節流:InputStream OutputStream,用于操作二進制文件
  • 字符流:Reader Writer,用于操作文本文件

InputStream

方法說明
int read()從輸入流中讀取下一個字節的數據。值字節以 int 形式返回,其范圍為 0 到 255。如果由于到達流的末尾而沒有可用的字節,則返回值 -1。此方法會阻塞,直到輸入數據可用、檢測到流的末尾或引發異常為止。
int read(byte b[])從輸入流中讀取一定數量的字節,并將其存儲到數組 b 中,并且盡可能把 b 填滿。實際讀取的字節數以整數形式返回。此方法會阻塞,直到輸入數據可用、檢測到文件結尾或引發異常為止。
int read(byte b[], int off, int len)也是把讀到的字節往 b 里塞,從 off 的位置開始塞,最多塞 len 個字節

InputStream 是一個抽象類,通過 new 它的子類 FileInputStream 來實例化

// 文件內容:hello
public static void main(String[] args) throws IOException {// 打開文件InputStream inputStream = new FileInputStream("test2.txt");// 讀取文件while (true) {int b = inputStream.read();if (b == -1) {break;}System.out.println(b);}// 關閉文件inputStream.close();
}
/*輸出:
104
101
108
108
111
*/

這正是 hello 的 ASCII 碼

要想把字節流還原成原來的文本,需要手動處理:

public static void main(String[] args) throws IOException {// 打開文件InputStream inputStream = new FileInputStream("test2.txt");// 讀取文件byte[] b = new byte[1024];int len = inputStream.read(b);// 還原成文本String s = new String(b, 0, len, StandardCharsets.UTF_8);System.out.println(s);// 關閉文件inputStream.close();
}

Reader

方法說明
int read(java.nio.CharBuffer target)嘗試將字符讀取到指定的字符緩沖區中
int read()讀取單個字符。此方法將阻塞,直到字符可用、發生I/O錯誤或到達流的末尾
int read(char cbuf[])將字符讀取到數組中。此方法將一直阻塞,直到某個輸入可用、出現I/O錯誤或到達流的末尾
int read(char cbuf[], int off, int len)將字符讀入數組的一部分。此方法將一直阻塞,直到某個輸入可用、出現I/O錯誤或到達流的末尾

使用 FileReader 實例化

例:Reader 直接讀取到文本

public static void main(String[] args) throws IOException {Reader reader = new FileReader("test2.txt");char[] buffer = new char[1024];int len = reader.read(buffer);for (int i = 0; i < len; ++i) {System.out.println(buffer[i]);}reader.close();
}

其實讀文件最方便的寫法,是使用 Scanner

這個我們在標準輸入的時候用過,只要把 System.in 換成其他 InputStream

public static void main(String[] args) throws IOException {InputStream inputStream = new FileInputStream("test2.txt");Scanner scanner = new Scanner(inputStream);String s = scanner.next();System.out.println(s);inputStream.close();
}

技巧:使用 try with resources 關閉文件

try (InputStream inputStream = new FileInputStream("test2.txt")){// ......
} catch (IOException e) {e.printStackTrace();
}

OutputStream

方法說明
void write(int b)將指定的字節寫入此輸出流
void write(byte b[])將指定字節數組中的 b.length 個字節寫入此輸出流
void write(byte b[], int off, int len)從偏移量為 off 的指定字節數組中寫入 len 個字節到此輸出流
public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test2.txt")) {outputStream.write('a');outputStream.write('b');outputStream.write('c');}
}

如果要輸出一個字符串,那么需要轉為字節數組:

public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test2.txt")) {String s = "你好";outputStream.write(s.getBytes());}
}

注意:打開文件會清空文件內容,寫的時候并不會

Writer

方法說明
void write(int c)寫入單個字符
void write(char cbuf[])寫入一個字符數組
void write(char cbuf[], int off, int len)寫入字符數組的一部分
void write(String str)寫入字符串
void write(String str, int off, int len)寫入字符串的一部分
public static void main(String[] args) throws IOException {try (Writer writer = new FileWriter("test2.txt")) {writer.write("hello world");}
}

使用 PrintWriter 包裝一下

public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test2.txt")) {PrintWriter printWriter = new PrintWriter(outputStream);// 此處 printWriter 的用法就和 System.out 類似了printWriter.println("aaa");printWriter.flush();}
}

注意PrintWriter 自帶緩沖區,如果你寫的內容太短,可能需要 flush 一下

更多案例

文件查找

遞歸查找目錄下的所有文件,將文件名包含指定字符串的文件刪除

import java.io.*;
import java.util.Scanner;public class demo {public static void main(String[] args) throws IOException {System.out.println("請輸入要掃描的路徑:");Scanner scanner = new Scanner(System.in);String rootPath = scanner.next();File root = new File(rootPath);if (!root.exists()) {System.out.println("輸入的路徑不存在");return;}System.out.println("請輸入要刪除的文件名(或部分):");String toDelete = scanner.next();// 遞歸刪除文件scanDir(root, toDelete);}public static void scanDir(File rootDir, String toDelete) throws IOException {File[] files = rootDir.listFiles();if (files == null) {return;}for (File f : files) {if (f.isDirectory()) {scanDir(f, toDelete);} else {tryDelete(f, toDelete);}}}public static void tryDelete(File f, String toDelete) throws IOException {if (f.getName().contains(toDelete)) {System.out.println("是否刪除文件(y/n):" + f.getCanonicalPath());Scanner scanner = new Scanner(System.in);String choice = scanner.next();if (choice.equals("y")) {f.delete();}}}
}

普通文件的復制

import java.io.*;
import java.util.Scanner;public class demo {public static void main(String[] args) throws IOException {System.out.println("請輸入要復制的文件路徑:");Scanner scanner = new Scanner(System.in);String srcPath = scanner.next();File srcFile = new File(srcPath);if (!srcFile.exists()) {System.out.println("文件不存在");return;}if (!srcFile.isFile()) {System.out.println("不是普通文件");return;}System.out.println("請輸入目標路徑:");String destPath = scanner.next();File destFile = new File(destPath);if (destFile.exists()) {System.out.println("目標已經存在");return;}// 開始復制try (InputStream inputStream = new FileInputStream(srcFile);OutputStream outputStream = new FileOutputStream(destFile)) {byte[] buf = new byte[1024];while (true) {int len = inputStream.read(buf);if (len == -1) {// 拷貝完成break;}outputStream.write(buf, 0, len);}}System.out.println("復制完成");}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167628.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM之jvisualvm多合一故障處理工具

jvisualvm多合一故障處理工具 1、visualvm介紹 VisualVM是一款免費的&#xff0c;集成了多個 JDK 命令行工具的可視化工具&#xff0c;它能為您提供強大的分析能力&#xff0c;對 Java 應 用程序做性能分析和調優。這些功能包括生成和分析海量數據、跟蹤內存泄漏、監控垃圾回…

SpringBoot:異步任務基礎與源碼剖析

官網文檔&#xff1a;How To Do Async in Spring | Baeldung。 Async注解 Spring框架基于Async注解提供了對異步執行流程的支持。 最簡單的例子是&#xff1a;使用Async注解修飾一個方法&#xff0c;那么這個方法將在一個單獨的線程中被執行&#xff0c;即&#xff1a;從同步執…

系列六、Spring整合單元測試

一、概述 Spring中獲取bean最常見的方式是通過ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式獲取bean&#xff0c;那么在Spring中如何像在SpringBoot中直接一個類上添加個SpringBootTest注解&#xff0c;即可在類中注入自己想要測試…

java反序列化漏洞詳解

java反序列化漏洞 文章目錄 java反序列化漏洞漏洞原理漏洞評級漏洞危害漏洞驗證漏洞防御典型案例 漏洞原理 由于java開發人員在編寫代碼時重寫了 readObject 方法&#xff0c;在重寫的 readObject 方法中調用其他函數實現鏈式調用最終調用到了危險函數&#xff0c;從而形成反序…

【C++】泛型編程 ? ( 類模板示例 - 數組類模板 | 自定義類中持有指針成員變量 )

文章目錄 一、支持 數組類模板 存儲的 自定義類1、可拷貝和可打印的自定義類2、改進方向3、改進方向 - 構造函數4、改進方向 - 析構函數5、改進方向 - 重載左移運算符6、改進方向 - 重載拷貝構造函數 和 等號運算符 二、代碼示例1、Array.h 頭文件2、Array.cpp 代碼文件3、Test…

[網鼎杯 2020 朱雀組]phpweb

看一下源碼 應該是輸入的date 作為函數&#xff0c;value作為內部參數的值&#xff0c;將date()函數返回的結果顯示在頁面上 回去看的時候&#xff0c;意外發現頁面有了新的跳轉&#xff0c;觀察一下發現&#xff0c;頁面每隔五秒就會發生一次跳轉 所以就抓包看看 抓包發現po…

GEE:kNN(k-最近鄰)分類教程(樣本制作、特征添加、訓練、精度、最優參數、統計面積)

作者:CSDN @ _養樂多_ 本文將介紹在Google Earth Engine (GEE)平臺上進行kNN(k-最近鄰)分類的方法和代碼,其中包括制作樣本點教程(本地、在線和本地在線混合制作樣本點,合并樣本點等),加入特征變量(各種指數、紋理特征、時間序列特征、物候特征等),運行kNN(k-最近…

Linux中,查看Tomcat版本、如何查看Tomcat版本

方法 在tomcat的bin目錄下&#xff0c;執行version.sh命令即可 結果

python每日一題——3最長連續序列

題目 給定一個未排序的整數數組 nums &#xff0c;找出數字連續的最長序列&#xff08;不要求序列元素在原數組中連續&#xff09;的長度。 請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 1&#xff1a; 輸入&#xff1a;nums [100,4,200,1,3,2] 輸出&#xf…

RpcServiceContext上下文

消費者: web 提供者: buss-service 同一服務器: 192.168.100.228 RpcServiceContext serviceContext RpcContext.getServiceContext(); //web->buss-serviceLOGGER.warn("getRequest->{}", JsonUtil.toJson(serviceContext.getRequest())); //getRequest-…

ElementUI table+dialog實現一個簡單的可編輯的表格

table組件如何實現可編輯呢&#xff1f; 我的需求是把table組件那樣的表格&#xff0c;實現它點擊可以彈出一個框&#xff0c;然后在這個框里面輸入你的東西&#xff0c;然后將他回顯回去&#xff0c;當然&#xff0c;輸入的有可能是時間啥的。 為什么要彈出彈層不在框上直接…

最近iphone手機的交管12123閃退,打不開的解決辦法?

蘋果手機系統和新版軟件不配&#xff0c;終極決絕辦法&#xff1a;升級IOS系統就好 可能是手機的內存不足了&#xff0c;因為在使用APP時&#xff0c;需要占用手機的內存&#xff0c;如果手機內存不足以支持軟件允許&#xff0c;軟件就會閃退。車主可以清理一下手機的內存&…

彈窗msvcp140_1.dll丟失的解決方法,超簡單的方法分享

在計算機使用過程中&#xff0c;我們經常會遇到一些錯誤提示&#xff0c;其中最常見的就是缺少某個文件的錯誤。最近&#xff0c;我在使用某些軟件時&#xff0c;遇到了一個名為“msvcp140_1.dll”的錯誤提示。這個錯誤通常出現在運行某些程序時&#xff0c;由于缺少了msvcp140…

項目總結報告(案例模板)

軟件項目總結報告模板套用&#xff1a; 項目概要項目工作分析經驗與教訓改進建議可納入的項目過程資產 --------進主頁獲取更多資料-------

2023年【汽車駕駛員(中級)】最新解析及汽車駕駛員(中級)試題及解析

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2023年汽車駕駛員&#xff08;中級&#xff09;最新解析為正在備考汽車駕駛員&#xff08;中級&#xff09;操作證的學員準備的理論考試專題&#xff0c;每個月更新的汽車駕駛員&#xff08;中級&#xff09;試題及解…

Doris中的物化視圖-查詢(十九)

物化視圖創建完成后&#xff0c;用戶的查詢會根據規則自動匹配到最優的物化視圖。 比如我們有一張銷售記錄明細表&#xff0c;并且在這個明細表上創建了三張物化視圖。一個存儲了不同時間不同銷售員的售賣量&#xff0c;一個存儲了不同時間不同門店的銷售量&#xff0c;以及每…

C#,《小白學程序》第二課:數組,循環與排序

1 什么是數組&#xff1f; 數組 Array 是一組數值&#xff08;數 或 值&#xff09;。 int[] a; int[,] b; int[][] c; Anything[] d; 都是數組。 2 排序 排序就是按大小、名字、拼音或你指定的信息進行比較后排隊。 排序是數組最基本的功能需求。 3 文本格式 /// <summa…

《數據結構、算法與應用C++語言描述》-代碼實現散列表(線性探查與鏈式散列)

散列表 完整可編譯運行代碼&#xff1a;Github:Data-Structures-Algorithms-and-Applications/_22hash/ 定義 字典的另一種表示方法是散列&#xff08;hashing&#xff09;。它用一個散列函數&#xff08;也稱哈希函數&#xff09;把字典的數對映射到一個散列表&#xff08…

spring-webflux的一些概念的理解

Spring5的webflux可以支持高吞吐量&#xff0c;使用相同的資源可以處理更加多的請求&#xff0c;它將會成為未來技術的趨勢&#xff0c;但是相對于學習其他的框架相比&#xff0c;它的學習曲線很高&#xff0c;綜合了很多現有的技術&#xff0c;即使按照教程學習能編寫代碼&…

requests庫的學習(詳細篇)

一、request庫的安裝 requests屬于第三方庫&#xff0c;Python不內置&#xff0c;因此需要我們手動安裝。 pip3 install requests