文件操作/IO

文件

文件是一種在硬盤上存儲數據的方式,操作系統幫我們把硬盤的一些細節都封裝起來了,程序員只需要了解文件相關的接口即可,相當于操作文件就是間接的操作硬盤了
硬盤用來存儲數據,和內存相比硬盤的存儲空間更大,訪問速度更慢,成本更低,持久化存儲,操作系統通過“文件系統”這樣的模塊來管理硬盤
在這里插入圖片描述
不同的文件系統管理文件的方式都是類似的
通過目錄(directory,平常叫文件夾,專業術語叫目錄)構成了N叉樹的樹形結構
我們在文件系統中都是通過路徑來確定一個具體的文件
在這里插入圖片描述
在這里插入圖片描述
同樣是一個cat.jpg文件,站在不同的基準目錄上,查找的路徑是不相同的

文件系統上存儲的文件,具體來說又分成兩大類
1.文本文件–存儲的是字符
字符怎么定義呢?
有個表叫utf8,這個表上數據的組合就是字符
2.二進制文件–存儲的是二進制數據
判斷文本文件和二進制文件最簡單的方式就是
直接用記事本打開,如果打開之后能看懂,就是文本,否則就是二進制

像word文檔,ppt,excel這些,如果托到記事本上,都是二進制文件,雖然word文檔里存的東西是漢字等可以看懂的內容,但是word文檔不僅僅包含我們自己輸入的內容,還有行間距,文字格式等眾多內容
但是如果把excel的后綴改成csv格式,就是文本文件了
在這里插入圖片描述

Java標準庫中操作文件(對文件系統操作)

操作文件可以理解成通過java代碼把你硬盤的文件刪除修改創建等,也就是通過java代碼操作文件系統
Java 中通過 java.io.File 類來對一個文件(包括目錄)進行抽象的描述。注意, File 對象可以對應到一個真實存在的文件,也可以對應到一個不存在的文件
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

獲取文件路徑

public static void main(String[] args) throws IOException {File file=new File("./test.txt");System.out.println(file.getParent());//上級目錄System.out.println(file.getName());//文件名System.out.println(file.getPath());//new File后面的是什么路徑,就輸出什么System.out.println(file.getAbsolutePath());//工作目錄拼接上當前目錄   在idea中運行一個程序,工作目錄就是項目所在的目錄System.out.println(file.getCanonicalPath());//對getAbsolutePath的這個路徑進行了修飾,讓這個路徑沒有多余的東西,比如那個.}

在這里插入圖片描述

創建文件

public static void main(String[] args) {File file=new File("./test.txt");System.out.println(file.exists());//在當前項目所在的路徑下(D:\code\Java\java-related-code\File)沒有test.txt這個文件,應該是falseSystem.out.println(file.isFile());//都沒有這個文件了,這兩行肯定都是false了System.out.println(file.isDirectory());}

在這里插入圖片描述
但是我們可以先創建這個文件
在這里插入圖片描述
文件跟目錄的區別可以認為是文件是這個路徑的重點,而目錄下面還有別的路徑
在這里插入圖片描述

刪除文件

public static void main(String[] args) {File file=new File("./test.txt");file.delete();}

在這里插入圖片描述

public static void main(String[] args) throws InterruptedException {File file=new File("./test.txt");//不是立刻刪除,等到程序運行結束再刪除file.deleteOnExit();Thread.sleep(2000);//程序運行兩秒會結束,所以這個文件在兩秒之后刪除}

在這里插入圖片描述

創建目錄

單層目錄

public static void main(String[] args) {File file = new File("./testDir");// mk => make    dir => directory// mkdir 一次只能創建一層目錄.  mkdirs 可以一次創建多級目錄file.mkdir();//file.mkdirs();}

在這里插入圖片描述
多層目錄

    public static void main(String[] args) {File file = new File("./testDir/111/222");// mk => make    dir => directory// mkdir 一次只能創建一層目錄.  mkdirs 可以一次創建多級目錄//file.mkdir();file.mkdirs();}

在這里插入圖片描述

文件重命名

public static void main(String[] args) {File file = new File("./test.txt");File file2 = new File("./src/test.txt");//本來test.txt跟src是同級別的,現在把test.txt移動到src目錄下面了
//因此文件重命名也可以做到移動文件的效果file.renameTo(file2);}

針對文件內容操作

Reader

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;// Reader 使用.
public class Demo6
{public static void main(String[] args) throws IOException{// FileReader 構造方法, 可以填寫一個文件路徑(絕對路徑/相對路徑都行), 也可以填寫一個構造好的 File 對象
//        Reader reader = new FileReader("d:/test.txt");
//        try {
//            // 中間的代碼無論出現啥情況, close 都能保證執行到.
//        } finally {
//            // 拋出異常, 或者 return, close 就都執行不到了~~
//            reader.close();
//        }// 上述使用 finally 的方式能解決問題, 但是不優雅.// 使用 try with resources 是更好的解決方案.try (Reader reader = new FileReader("d:/test.txt")){while (true){char buf[] = new char[1024];int n = reader.read(buf);//讀到的有效字符的個數if (n == -1){// 讀到文件末尾了.break;}//實際只讀了n個字符,小于n就行了for (int i = 0; i < n; i++){System.out.print(buf[i] + ",");}}}}
}

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
文件泄露相當于打開很多文件,使用完之后都不關閉,文件描述符表就滿了,再打開新的文件,文件描述符就裝不下了,這些文件就不知道上哪里去了,就造成了文件泄露
在這里插入圖片描述

InputStream

在這里插入圖片描述

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;public class Demo7 {public static void main(String[] args) throws IOException {try (InputStream inputStream = new FileInputStream("d:/test.txt")) {while (true) {byte[] buf = new byte[1024];int n = inputStream.read(buf);if (n == -1) {break;}for (int i = 0; i < n; i++) {System.out.printf("%x ", buf[i]);}String s = new String(buf, 0, n, "utf8");//把buf數組的從0到n下標在string的構造方法中,通過utf8的編碼轉換,轉換成人能看懂的字符串System.out.println(s);}}}
}

在這里插入圖片描述
于是我們可以借助Scanner來完成上述操作
平時我們輸入是
Scanner scanner=new Scanner(System.in);

那么system.in的類型也是一個InputStream
在這里插入圖片描述
在這里插入圖片描述
于是我們就可以

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;public class Demo8 {public static void main(String[] args) throws IOException {try (InputStream inputStream = new FileInputStream("d:/test.txt")) {Scanner scanner = new Scanner(inputStream);// 此時就是從 test.txt 這個文件中讀取數據了!!String s = scanner.next();System.out.println(s);}}
}

在這里插入圖片描述

write

在這里插入圖片描述

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class Demo9 
{public static void main(String[] args) throws IOException {try (Writer writer = new FileWriter("d:/test.txt", true)) {// write 是可以一次直接寫一個字符串. 這個是非常方便的.writer.write("hello java");}}
}

在這里插入圖片描述

經典面試題

1.掃描指定目錄,并找到名稱中包含指定字符的所有普通文件(不包含目錄),并且后續詢問用戶是否要刪除該文件

import java.io.File;
import java.util.Scanner;public class Demo10 {private static Scanner scanner = new Scanner(System.in);public static void main(String[] args) {// 1. 讓用戶輸入一個目錄. 后續的查找都是針對這個目錄來進行的.System.out.println("請輸入要搜索的根目錄: ");File rootPath = new File(scanner.next());// 2. 再讓用戶輸入要搜索/要刪除的關鍵詞.System.out.println("請輸入要刪除的關鍵詞: ");String word = scanner.next();// 3. 判定一下當前輸入的目錄是否有效.if (!rootPath.isDirectory()) {System.out.println("您此時輸入的路徑不是合法目錄!");return;}// 4. 遍歷目錄. 從根目錄出發, 按照 深度優先(遞歸) 的方式, 進行遍歷scanDir(rootPath, word);}public static void scanDir(File currentDir, String word) {// 1. 先列出當前目錄中都包含哪些內容.File[] files = currentDir.listFiles();if (files == null || files.length == 0) {// 空的目錄或者非法的目錄return;}// 2. 遍歷列出的文件, 分兩個情況分別討論.for (File f : files) {// 加個日志, 方便看程序執行的過程.System.out.println(f.getAbsolutePath());if (f.isFile()) {// 3. 如果當前文件是普通文件, 看看文件名是否包含了 word, 來決定是否要刪除.dealFile(f, word);} else {// 4. 如果當前文件是目錄文件, 就遞歸執行 scanDirscanDir(f, word);}}}private static void dealFile(File f, String word) {// 1. 先判定當前文件名是否包含 wordif (!f.getName().contains(word)) {// 此時這個文件不包含 word 關鍵詞. 直接跳過.return;}// 2. 包含 word 就需要詢問用戶是否要刪除該文件?System.out.println("該文件是: " + f.getAbsolutePath() + ", 是否要確認刪除? (Y/N)");String choice = scanner.next();if (choice.equals("Y") || choice.equals("y")) {f.delete();}// 如果是其他值, 都忽略.}
}

2.進行普通文件的復制

在這里插入圖片描述

import java.io.*;
import java.util.Scanner;// 完成文件復制.
public class Demo11 {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);// 1. 輸入路徑并且合法性判定System.out.println("請輸入要復制的源文件路徑: ");String src = scanner.next();File srcFile = new File(src);if (!srcFile.isFile()) {System.out.println("您輸入的源文件路徑非法!");return;}System.out.println("請輸入要復制到的目標路徑: ");String dest = scanner.next();File destFile = new File(dest);// 不要求目標文件本身存在. 但是得保證目標文件所在的目錄, 得是存在的.// 假設目標文件寫作 d:/tmp/cat2.jpg, 就需要保證 d:/tmp 目錄是存在的.if (!destFile.getParentFile().isDirectory()) {System.out.println("您輸入的目標文件路徑非法!");return;}// 2. 進行復制操作的過程. 按照字節流打開.try (InputStream inputStream = new FileInputStream(srcFile);OutputStream outputStream = new FileOutputStream(destFile)) {while (true) {byte[] buffer = new byte[20480];int n = inputStream.read(buffer);System.out.println("n = " + n);if (n == -1) {System.out.println("讀取到 eof, 循環結束. ");break;}outputStream.write(buffer, 0, n);}}}
}

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

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

相關文章

使用FTP文件傳輸協議的潛在風險

數據&#xff08;事實&#xff0c;數字&#xff0c;價值&#xff09;是當今業務運行的核心要素。但是&#xff0c;如果數據沒有得到有效的存儲和傳輸&#xff0c;它們就會成為阻礙業務發展的障礙。如果企業不能及時地把數據送到合適的地方&#xff0c;就會造成嚴重的經濟損失。…

【skynet】skynet 入門代碼

寫在前面 本文將從零開始&#xff0c;寫第一個 skynet 程序 HelloWorld 。通過 HelloWorld 可以熟悉 skynet 的運作方式&#xff0c;和了解其 api 。 文章目錄 寫在前面準備工作編寫代碼運行結果 準備工作 首先要有一個編譯好&#xff0c;而且工作正常的 skynet 。 編寫代碼…

【Linux】Shell腳本之流程控制語句 if判斷、for循環、while循環、case循環判斷 + 實戰詳解[?建議收藏!!?]

&#x1f468;?&#x1f393;博主簡介 &#x1f3c5;云計算領域優質創作者 ??&#x1f3c5;華為云開發者社區專家博主 ??&#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社區&#xff1a;運維交流社區 歡迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

.bit域名調研

.bit域名研究 問題&#xff1a; .bit域名和ENS域名的相同點&#xff1f;不同點&#xff1f;有什么關系&#xff1f; .bit的定義 .bit 是基于區塊鏈的&#xff0c;開源的&#xff0c;跨鏈去中心化賬戶系統.bit 提供了以 .bit 為后綴的全局唯一的命名體系&#xff0c;可用于加密…

安全第二次

一&#xff0c;iframe <iframe>標簽用于在網頁里面嵌入其他網頁。 1&#xff0c;sandbox屬性 如果嵌入的網頁是其他網站的頁面&#xff0c;因不了解對方會執行什么操作&#xff0c;因此就存在安全風險。為了限制<iframe>的風險&#xff0c;HTML 提供了sandb…

分布式應用:Zabbix監控MariaDB

目錄 一、理論 1.Zabbix監控MariaDB 二、實驗 1.Zabbix監控MariaDB 一、理論 1.Zabbix監控MariaDB &#xff08;1&#xff09;環境 zabbix服務端&#xff1a;192.168.204.214 zabbix客戶端&#xff1a;192.168.204.215 &#xff08;2&#xff09;MareaDB安裝 安裝 za…

做海外游戲推廣有哪些條件?

做海外游戲推廣需要充分準備和一系列條件的支持。以下是一些關鍵條件&#xff1a; 市場調研和策略制定&#xff1a;了解目標市場的文化、玩家偏好、競爭格局等是必要的。根據調研結果制定適合的推廣策略。 本地化&#xff1a;將游戲內容、界面、語言、貨幣等進行本地化&#…

使用ip2region獲取客戶端地區

目錄 從gitee拉取ip2region.xdb資源文件 寫測試類 注意要寫對資源路徑 本地測試結果 ?編輯 遠端測試結果 從gitee拉取ip2region.xdb資源文件 git clone https://gitee.com/lionsoul/ip2region.git 將xdb放入resources資源文件夾 引入依賴 <dependency><groupId&…

由淺入深C系列五:使用libcurl進行基于http get/post模式的C語言交互應用開發

使用libcurl進行基于http get/post模式的C語言交互應用開發 簡介環境準備在線資源示例代碼測試調用運行結果 簡介 大多數在linux下的開發者&#xff0c;都會用到curl這個命令行工具。對于進行restful api的測試等&#xff0c;非常方便。其實&#xff0c;這個工具還提供了一個C…

Python中單引號、雙引號和三引號的區別

① 單引號和雙引號主要用來表示字符串 # 單引號 astr = Python print(type(astr)) # <class str># 雙引號"" bstr = "Python" print(type(bstr)) # <class str> str1 = I\m a big fan of Python. print(str1) # Im a big fan of Python.s…

[HDLBits] Exams/m2014 q4d

Implement the following circuit: module top_module (input clk,input in, output out);always(posedge clk) beginout<out^in;end endmodule直接寫out^in就行

Vue 使用 vite 創建項目

vite 是新一代前端構建工具&#xff0c;和 webpack 類似。 vite 的啟動速度更快。在開發環境中&#xff0c;不需要打包就可以直接運行。 vite 的更新速度更快。當修改內容后&#xff0c;不需要刷新瀏覽器&#xff0c;頁面就會實時更新。 vite 完全是按需編譯。它只會編譯需要…

【考研數學】高等數學第三模塊——積分學 | Part II 定積分(反常積分及定積分應用)

文章目錄 前言三、廣義積分3.1 斂散性概念&#xff08;一&#xff09;積分區間為無限的廣義積分&#xff08;二&#xff09;積分區間有限但存在無窮間斷點 3.2 斂散性判別法 四、定積分應用寫在最后 前言 承接前文&#xff0c;梳理完定積分的定義及性質后&#xff0c;我們進入…

企業網盤 vs 傳統存儲設備:為何云存儲成為首選?

企業網盤的出現為企業提供了新的存儲方式&#xff0c;相較于傳統的存儲設備&#xff0c;為何越來越多的企業選擇了云存儲呢&#xff1f; 一、存儲成本 在企業數據存儲方面&#xff0c;成本是企業重要的考量因素。企業網盤是基于云存儲技術的存儲工具&#xff0c;因此它比傳統的…

基于DBN的偽測量配電網狀態估計,DBN的詳細原理

目錄 背影 DBN神經網絡的原理 DBN神經網絡的定義 受限玻爾茲曼機(RBM) DBN的偽測量配電網狀態估計 基本結構 主要參數 數據 MATALB代碼 結果圖 展望 背影 DBN是一種深度學習神經網絡,擁有提取特征,非監督學習的能力,是一種非常好的分類算法,本文將DBN算法偽測量配電網…

Netty:ByteBuf的資源釋放方法

說明 io.netty.buffer.ByteBuf實現了io.netty.util.ReferenceCounted接口&#xff0c;需要顯式釋放。當ByteBuf被實例化后&#xff0c;它的引用計數是1。 調用ByteBuf對象的release方法釋放&#xff1a; ByteBuf的release()方法使引用計數減少1。只有當執行以后引用計數減少…

OpenZFS 2.2 發布 RC3,支持 Linux 6.4

導讀之前的 OpenZFS 2.2 候選版本已致力于實現與 Linux 6.4 內核的兼容性&#xff0c;而在 2.2-rc3 中&#xff0c;Linux 6.4 支持的元跟蹤器已標記為已完成。 OpenZFS 2.2 發布了第 3 個 RC 版本。 之前的 OpenZFS 2.2 候選版本已致力于實現與 Linux 6.4 內核的兼容性&#x…

Vue3 引用第三方Swiper內容觸摸滑動簡單應用

去官網查看更多教程→&#xff1a;Swiper官網 → 點擊教程在vue中使用Swiper→ 在Vue中使用Swiper cd 到項目 安裝Swiper&#xff1a; cnpm install --save swiper 安裝指定版本 cnpm install --save swiper8.1.6 9.4.1 10.1.0…

SpringBoot-Hello World

SpringBootWeb快速入門 創建Springboot工程&#xff0c;并勾選web開發相關依賴定義HelloController類&#xff0c;添加方法hello&#xff0c;并添加相關注釋運行測試 創建新的SpringBoot項目 幾個注意的點&#xff1a; Name&#xff1a;基本上不用管&#xff0c;會根據下面的Ar…

關于elementui的input的autocomplete的使用

項目中需要實現搜索框搜索時能自動提示可選項的功能&#xff0c;elementui的input組件有已經封裝好的el-autocomplete可以使用&#xff0c;但是在使用中發現一些問題&#xff0c;記錄一下 基礎使用 // html部分 <el-autocompletev-model"name":fetch-suggestion…