做網(wǎng)站的費(fèi)用記哪個(gè)科目百度pc網(wǎng)頁(yè)版登錄入口
阿華代碼,不是逆風(fēng),就是我瘋
你們的點(diǎn)贊收藏是我前進(jìn)最大的動(dòng)力!!
希望本文內(nèi)容能夠幫助到你!!
目錄
一:認(rèn)識(shí)文件
1:文件的概念
2:文件的結(jié)構(gòu)
3:文件路徑
(1)絕對(duì)路徑
(2)相對(duì)路徑
(3)舉例
二:文件的分類(lèi)
1:文本文件
2:二進(jìn)制文件
3:如何判斷文件的種類(lèi)
三:Feil類(lèi)對(duì)文件操作
1:Feil類(lèi)
2:File類(lèi)的構(gòu)造方法
3:獲取屬性方法
代碼示例一
代碼示例二
?4:判斷方法
?5:創(chuàng)建刪除方法
6:創(chuàng)建移動(dòng)方法
7:創(chuàng)建File對(duì)象代表的目錄
8:文件改名操作
四:文件流
五:字節(jié)流
1:InputStream
(0)打開(kāi)文件
(1)構(gòu)造方法
(2)類(lèi)/異常解析
(3)文件資源泄露
(4):read方法
①引入
②三種參數(shù)代碼示例
2:OutputStream
3:Scanner聯(lián)動(dòng)
?編輯
六:字符流
1:Reader類(lèi)
2:Writer類(lèi)?
一:認(rèn)識(shí)文件
1:文件的概念
對(duì)于計(jì)算機(jī)來(lái)說(shuō),“文件”是一個(gè)非常廣義的概念,可以指普通的文件,文件夾,一些硬件設(shè)備也被抽象成了文件(例如:鍵盤(pán),耳機(jī),顯示器,網(wǎng)卡等)
對(duì)于機(jī)械硬盤(pán)來(lái)說(shuō)它更加擅長(zhǎng)順序讀寫(xiě),不擅長(zhǎng)隨機(jī)讀寫(xiě)
比如有一個(gè)很大的文件,我們需要把這個(gè)文件整體復(fù)制一份就是順序讀寫(xiě)
某個(gè)目錄中有很多的小文件,(數(shù)目比較多)需要把整個(gè)目錄都拷貝一份,就是隨機(jī)讀寫(xiě)。
2:文件的結(jié)構(gòu)
文件系統(tǒng)的結(jié)構(gòu)是按照“樹(shù)形結(jié)構(gòu)”來(lái)組織文件的,是N叉樹(shù),一個(gè)普通文件(非目錄)就是一個(gè)葉子節(jié)點(diǎn),對(duì)一個(gè)目錄文件來(lái)說(shuō),里面又可以有很多的子節(jié)點(diǎn)
3:文件路徑
形如上述的圖片,從樹(shù)根節(jié)點(diǎn),一級(jí)一級(jí)的往下走,直到直到目標(biāo)文件,這個(gè)過(guò)程中經(jīng)過(guò)的所有文件目錄的名字串起來(lái),使用正斜杠——“/”,或者反斜杠——“\”分割,就構(gòu)成了“路徑”
注:此過(guò)程并非是遍歷樹(shù),可以想象成類(lèi)似于Hash這樣的結(jié)構(gòu)
(1)絕對(duì)路徑
從樹(shù)根節(jié)點(diǎn) 出發(fā),一層一層到達(dá)目標(biāo)文件
(2)相對(duì)路徑
先指定一個(gè)“當(dāng)前目錄”/“基準(zhǔn)目錄”,從當(dāng)前目錄出發(fā),找到目標(biāo)文件
(3)舉例
二:文件的分類(lèi)
1:文本文件
文本文件是按照“字符串”的形式來(lái)理解文本內(nèi)容的(文本文件里面的二進(jìn)制內(nèi)容,也都表示為字符串,可以理解為——二進(jìn)制內(nèi)容都是合法的字符(像字符編碼,英文字母用ASCII,漢字用utf8/gbk))
舉例:.java? ?.c? ? .cpp? ?文本文檔
2:二進(jìn)制文件
二進(jìn)制文件沒(méi)有上述的限制,儲(chǔ)存任何數(shù)據(jù)都可以。
舉例:圖片,音頻,可執(zhí)行程序,動(dòng)態(tài)庫(kù),.class文件,富文本文件
富文本文件包括不限于:word? docx excle? xlsx? power point? pptx
3:如何判斷文件的種類(lèi)
使用記事本打開(kāi)文本文件,如果看到的是亂碼,就是二進(jìn)制文件
三:Feil類(lèi)對(duì)文件操作
引入:在Java中,對(duì)于文件操作的Api這里有兩類(lèi)
針對(duì)文件系統(tǒng)的操作:創(chuàng)建,刪除,重命名,
針對(duì)文件內(nèi)容的操作:讀文件,寫(xiě)文件
1:Feil類(lèi)
2:File類(lèi)的構(gòu)造方法
3:獲取屬性方法
代碼示例一
構(gòu)造File用絕對(duì)路徑
import java.io.File;
import java.io.IOException;public class IO1 {public static void main(String[] args) throws IOException {File f = new File("C:/User/1/test.txt");//絕對(duì)路徑//File f = new File("./test.txt");System.out.println(f.exists());//判斷文件目錄是否存在System.out.println(f.getParent());System.out.println(f.getName());//返回file對(duì)象的名稱(chēng)System.out.println(f.getPath());//返回file對(duì)象的文件路徑System.out.println(f.getAbsolutePath());//返回絕對(duì)路徑System.out.println(f.getCanonicalPath());//返回對(duì)象修飾過(guò)后的路徑canonical規(guī)范的}}
代碼示例二
構(gòu)造對(duì)象用相對(duì)路徑
.getPath()得到的就是構(gòu)造方法中的參數(shù)
Canonical(讀音:克撓你扣)規(guī)范的——可以理解為化簡(jiǎn)路徑
import java.io.File;
import java.io.IOException;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 19:28*/
public class IO1 {public static void main(String[] args) throws IOException {//File f = new File("C:/User/1/test.txt");//絕對(duì)路徑File f = new File("./test.txt");System.out.println(f.exists());//判斷文件目錄是否存在System.out.println(f.getParent());//返回父目錄文件路徑System.out.println(f.getName());//返回file對(duì)象的名稱(chēng)System.out.println(f.getPath());//返回file對(duì)象的文件路徑System.out.println(f.getAbsolutePath());//返回絕對(duì)路徑System.out.println(f.getCanonicalPath());//返回對(duì)象修飾過(guò)后的路徑canonical規(guī)范的}}
?4:判斷方法
我們可以使用file.createNewFile(如下代碼),也可以直接手動(dòng)在當(dāng)前目錄創(chuàng)建一個(gè)File文件——名字叫test.txt
import java.io.File;
import java.io.IOException;public class IODemon2 {public static void main(String[] args) throws IOException {File file = new File("./test.txt");System.out.println(file.exists());//文件存在嗎System.out.println(file.isFile());//是普通文件嘛System.out.println(file.isDirectory());//是目錄嗎boolean ret = file.createNewFile();//創(chuàng)建文件;返回的結(jié)果就是創(chuàng)建成功和創(chuàng)建失敗System.out.println("ret:" + ret);}}
?5:創(chuàng)建刪除方法
file.delete刪除文件,返回值類(lèi)型為boolean類(lèi)型
file.deleteNewFile退出時(shí)刪除文件,返回值為void
注:刪除目錄只能一級(jí)一級(jí)的刪除
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;import java.io.File;
import java.io.IOException;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:17*/
public class IODemon3 {public static void main(String[] args) throws IOException, InterruptedException {File file = new File("./test.txt");//boolean ret = file.delete();//刪除文件//System.out.println(ret);boolean ret = file.createNewFile();//創(chuàng)建文件file.deleteOnExit();//返回值為void類(lèi)型,退出的時(shí)候刪除文件,測(cè)試的時(shí)候注意看左邊的目錄欄Thread.sleep(5000);}}
6:創(chuàng)建移動(dòng)方法
import java.io.File;
import java.util.Arrays;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:44*/
public class IODemon4 {public static void main(String[] args) {File file = new File(".");//返回的是對(duì)象代表的目錄下所有的文件//返回的是一個(gè)String[]類(lèi)型的數(shù)組String[] files = file.list();System.out.println(Arrays.toString(files));//返回的file對(duì)象代表的目錄下所有的文件,不過(guò)是以file對(duì)象表示File[] files2 = file.listFiles();System.out.println(Arrays.toString(files2));}
}
7:創(chuàng)建File對(duì)象代表的目錄
import java.io.File;
import java.lang.reflect.Field;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:58*/
public class IODemon5 {public static void main(String[] args) {/* File file = new File("./aaa");//創(chuàng)建file為對(duì)象的目錄boolean ret = file.mkdir();System.out.println(ret);*//* File file = new File("./bbb");boolean ret2 = file.mkdirs();//mkdirs(可以用于創(chuàng)建單個(gè)目錄,也可以用于創(chuàng)建多級(jí)目錄)System.out.println(ret2);*//*File file = new File("./aaa/bbb/ccc");boolean ret2 = file.mkdirs();//mkdirs(可以用于創(chuàng)建單個(gè)目錄,也可以用于創(chuàng)建多級(jí)目錄)System.out.println(ret2);*/File file = new File("./bbb");boolean ret = file.delete();//刪除只能一級(jí)目錄一級(jí)目錄的刪System.out.println(ret);}
}
8:文件改名操作
注意細(xì)節(jié):file1文件改名為file2對(duì)象
import java.io.File;public class IODemon6 {public static void main(String[] args) {File file1 = new File("./aaa/bbb/ccc/bbb");File file2 = new File("./bbb");boolean ret = file2.renameTo(file1);//把bbb這個(gè)文件移入"./aaa/bbb/ccc"的/ccc下System.out.println(ret);}}
四:文件流
什么是文件流呢?
舉個(gè)例子:要寫(xiě)100字節(jié)的內(nèi)容,我們可以分10次寫(xiě)每次寫(xiě)10字節(jié)的內(nèi)容,也可以分5次來(lái)寫(xiě),每次寫(xiě)20字節(jié)的內(nèi)容;當(dāng)然也可以一次性寫(xiě)完
“流”是操作系統(tǒng)提供的概念,Java標(biāo)準(zhǔn)庫(kù)中對(duì)于“進(jìn)行了”封裝,提供了一組類(lèi)來(lái)負(fù)責(zé)這些工作
我們把這些類(lèi)主要分為兩種:字節(jié)流和字符流
五:字節(jié)流
代表類(lèi):InputStream——輸入流,OutPutStream——輸出流
1:InputStream
(0)打開(kāi)文件
按照讀文件的方式打開(kāi)一個(gè)文件
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 11:46*/
public class IODemon7 {public static void main(String[] args) throws IOException {/*//打開(kāi)文件InputStream inputStream = new FileInputStream("./test.txt");//在中間一定會(huì)涉及一些對(duì)文件的操作之類(lèi)的,如果遇到bug或者像return之類(lèi)的不可控的操作,close操作可能就會(huì)執(zhí)行不到了//打開(kāi)了文件最后還要關(guān)掉,打開(kāi)文件操作會(huì)拋出FileNotFoundException異常inputStream.close();//關(guān)閉文件會(huì)拋出IOException異常,前后兩者為父類(lèi)子類(lèi)的關(guān)系*//*//第二種寫(xiě)法InputStream inputStream = null;try {inputStream = new FileInputStream("./test.txt");}finally{inputStream.close();}*//*//第三種寫(xiě)法,try with resources版本try (InputStream inputStreeam = new FileInputStream("./test.txt")){//出了try{}代碼塊范圍后,編譯器會(huì)自動(dòng)調(diào)用.close方法關(guān)閉文件//FileInputStream繼承于InputStream,InputStream又實(shí)現(xiàn)了Closeable接口,必須實(shí)現(xiàn)了Closeable接口才可以被放到try()里面}*/}}
(1)構(gòu)造方法
注:你給cpu送的信息叫輸入,比如讀操作。cpu給存儲(chǔ)器等這些硬件設(shè)備送的信息叫做輸出,比如寫(xiě)操作
(2)類(lèi)/異常解析
(3)文件資源泄露
如果不執(zhí)行文件關(guān)閉.close方法,就會(huì)有大問(wèn)題。這里本質(zhì)上是釋放了文件的相關(guān)資源(PCB文件描述符表,不懂得鐵子可以看前面寫(xiě)過(guò)的文章)這個(gè)表本質(zhì)是一個(gè)數(shù)組或者順序表,每打開(kāi)一個(gè)文件,就會(huì)占據(jù)一個(gè)位置,如果不關(guān)閉一直打開(kāi)就會(huì)導(dǎo)致表被耗盡,后續(xù)再想打開(kāi)就會(huì)報(bào)錯(cuò)。
那么提問(wèn),文件描述符表不會(huì)動(dòng)態(tài)擴(kuò)容嗎?對(duì)操作系統(tǒng)的內(nèi)核來(lái)說(shuō),需要很高的性能,付出的代價(jià)太大了,容易造成系統(tǒng)的卡頓
(4):read方法
①引入
read讀文件就是把硬盤(pán)數(shù)據(jù)讀取到內(nèi)存當(dāng)中buffer,譯為緩沖區(qū)
注意點(diǎn)①:offset此處縮寫(xiě)了
注意點(diǎn)②:傳入的數(shù)組,在方法內(nèi)部對(duì)數(shù)組內(nèi)容修改過(guò)后,方法外部也能生效
注意點(diǎn)③:字符流讀取文件的時(shí)候,
②三種參數(shù)代碼示例
①*不帶參數(shù)的讀,一個(gè)一個(gè)字符的讀
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 12:18*/
public class IOStream8 {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")){//讀取操作,讀到-1的時(shí)候就會(huì)停止while(true){int a = inputStream.read();if (a == -1){break;}System.out.print(a + " ");//讀取的abcdef是ascii碼值}}}
}
②*帶入數(shù)組參數(shù)的讀取,一次讀取多個(gè)字符
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 12:56*/
public class IODemon9 {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")){while (true){//也可以一次讀若干個(gè)字節(jié),buffer(緩沖區(qū))byte[] buffer = new byte[1024];//讀的時(shí)候會(huì)嘗試把buffer[1024]填滿(mǎn)int n = inputStream.read(buffer);//傳入的參數(shù)是buffer數(shù)組,方法內(nèi)部對(duì)數(shù)組內(nèi)容進(jìn)行修改后,方法外部也能生效,實(shí)際上填不滿(mǎn)1024個(gè)字節(jié),if (n == -1){break;//讀取到最后一個(gè)字符,就break}for (int i = 0; i < n; i++) {System.out.printf(" %x " ,buffer[i]);//遍歷數(shù)組,并打印}}}}
}
③*構(gòu)造String從0讀到n(利用offset)
offset翻譯為抵消補(bǔ)償
注意看while循環(huán):什么是文件流,假設(shè)我們要讀取的文件很大,在這個(gè)循環(huán)中,每次盡可能讀取1024個(gè)字節(jié)(可能讀到的字節(jié)數(shù)比這個(gè)要小),這次讀不完,我們就先用String給存起來(lái)(0到n),下一次while循環(huán)就接著讀,“特別像字符串拼接? ?”
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 13:22*/
public class IODemon10 {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")){while (true){//也可以一次讀若干個(gè)字節(jié),buffer(緩沖區(qū))byte[] buffer = new byte[1024];//讀的時(shí)候會(huì)嘗試把buffer[1024]填滿(mǎn)int n = inputStream.read(buffer);//傳入的參數(shù)是buffer數(shù)組,方法內(nèi)部對(duì)數(shù)組內(nèi)容進(jìn)行修改后,方法外部也能生效if (n == -1){break;}String string = new String(buffer , 0 , n);//構(gòu)造一個(gè)String對(duì)象,數(shù)組前n個(gè)字節(jié)來(lái)構(gòu)造System.out.printf(string);//遍歷數(shù)組,并打印}}}
}
2:OutputStream
按照寫(xiě)的方式打開(kāi)文件
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 12:06*/
public class IODemo11 {public static void main(String[] args) throws FileNotFoundException {try{//打開(kāi)操作會(huì)把原有文件中的內(nèi)容清空,所以罪魁禍?zhǔn)撞皇荳rite操作而是打開(kāi)操作OutputStream outputStream = new FileOutputStream("./test.txt");//OutputStream outputStream = new FileOutputStream("./test.txt",true);追加寫(xiě)byte[] buffer = new byte[]{97,98,99,100,101};outputStream.write(buffer);}catch (IOException e) {throw new RuntimeException(e);}}
}
3:Scanner聯(lián)動(dòng)
Scanner(System.in)中System.in本質(zhì)就是一個(gè)InputStream
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 13:21*/
public class IODemo14 {public static void main(String[] args) throws FileNotFoundException {try(InputStream inputStream = new FileInputStream("./test.txt")){Scanner scanner = new Scanner(inputStream);while(scanner.hasNext()){String s = scanner.next();System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}
六:字符流
以字符為單位進(jìn)行讀寫(xiě),例如:用utf8表示漢字,3個(gè)字節(jié)就是一個(gè)漢字,每次讀寫(xiě)都得以3個(gè)字節(jié)為單位來(lái)進(jìn)行讀寫(xiě),不能一次讀半個(gè)漢字
在用char類(lèi)型的數(shù)組存儲(chǔ)漢字時(shí)是把3個(gè)字節(jié)組成的utf8漢字轉(zhuǎn)化為了Unicode,輸出為String類(lèi)型時(shí)在把Unicode轉(zhuǎn)化為字節(jié)
代表類(lèi):Reader——輸入,Writer——輸出
1:Reader類(lèi)
代碼示例
把byte換為char測(cè)試一下,區(qū)別在于打印漢字
import java.io.*;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 12:33*/
public class IODemo12 {public static void main(String[] args) {try{//Reader和Writer的字符流與OutputStream和InputStream相似Reader reader= new FileReader("./test.txt");while(true){char[] buffer = new char[1024];int n = reader.read(buffer);if (n == -1){break;}String s = new String(buffer , 0 , n);System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}
如果文件中有內(nèi)容換行操作了,那么有可能會(huì)有一些內(nèi)容打印不到
2:Writer類(lèi)?
記住:要把文件打開(kāi)操作放到try()的括號(hào)里,要不然不會(huì)默認(rèn)執(zhí)行close關(guān)閉文件操作
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 13:07*/
public class IODemo13 {public static void main(String[] args) {try(Writer writer = new FileWriter("./test.txt",true)) {String s = "可選擇續(xù)寫(xiě)操作 或者 清空在寫(xiě)操作";writer.write(s);} catch (IOException e) {throw new RuntimeException(e);}}
}