
1.File類
File類是Java中用于表示文件或目錄的類。它提供了一些方法來操作文件和目錄的屬性和內(nèi)容,可以進(jìn)行文件的創(chuàng)建、刪除、重命名等操作。
File類可以用于表示磁盤上的實(shí)際文件或目錄,也可以表示一個(gè)虛擬的文件或目錄。File對(duì)象可以通過路徑來創(chuàng)建,路徑可以是絕對(duì)路徑或相對(duì)路徑。
-
絕對(duì)路徑(Absolute Path):絕對(duì)路徑是從文件系統(tǒng)的根目錄開始描述文件或目錄的位置。它包含了完整的路徑信息,從根目錄一直到目標(biāo)文件或目錄的全路徑。在Windows中,絕對(duì)路徑以盤符(例如C:\)開頭;在Unix/Linux系統(tǒng)中,絕對(duì)路徑以斜杠(/)開頭。
-
相對(duì)路徑(Relative Path):相對(duì)路徑是相對(duì)于當(dāng)前工作目錄或引用文件所在位置的路徑。它指定文件或目錄相對(duì)于當(dāng)前位置的位置關(guān)系。相對(duì)路徑?jīng)]有從根目錄開始的完整路徑,而是通過使用“.”(當(dāng)前目錄)和“…”(上級(jí)目錄)等符號(hào)來描述位置關(guān)系。
創(chuàng)建File類對(duì)象:
File file = new File("文件路徑(絕對(duì)/相對(duì))");
// 此處的文件路徑不要要求一定存在
File類中的常用方法:
方法 | 描述 |
---|---|
getParent() | 獲取文件的父目錄 |
getName() | 獲取文件的名字 |
getPath() | 獲取文件的路徑 |
getAbsolutePath() | 獲取絕對(duì)路徑 |
getCanonicalPath() | 獲取標(biāo)準(zhǔn)的絕地路徑。 |
createNewFile() | 創(chuàng)建文件 |
exists() | 判斷文件是否存在 |
delete() | 刪除文件 |
mkdir() | 創(chuàng)建目錄(與src同一級(jí)) |
mkdirs() | 創(chuàng)建多級(jí)目錄 |
isDirectory() | 判斷是否為目錄 |
isFile() | 是否為文件 |
renameTo(File dest) | 重命名 |
list() | 返回當(dāng)前目錄下所有文件名 |
上述都是一些獲取文件和目錄的信息以及增刪等操作. 接下來介紹一些文件的讀寫操作.
2.流的概念
在Java的IO操作中,流(Stream)是指數(shù)據(jù)的傳輸管道。它將程序與輸入/輸出設(shè)備(例如文件、網(wǎng)絡(luò)連接等)連接起來,使得數(shù)據(jù)能夠在程序和設(shè)備之間流動(dòng)。
Java的IO流分為輸入流和輸出流兩種類型。
- 輸入流用于從外部讀取數(shù)據(jù)
- 輸出流用于向外部寫入數(shù)據(jù)。
Java中的流操作按照字節(jié)或字符的方式進(jìn)行。字節(jié)流(byte stream)是以字節(jié)為單位進(jìn)行數(shù)據(jù)傳輸?shù)?,適用于處理二進(jìn)制數(shù)據(jù)。字符流(character stream)是以字符為單位進(jìn)行數(shù)據(jù)傳輸?shù)模m用于處理文本數(shù)據(jù)。
這里的InputStream,OutputStream,Reader和Writer都是抽象類
.Java提供了一些實(shí)現(xiàn)這些抽象父類的子類,用于應(yīng)對(duì)不同的場(chǎng)景.
3.InputStream
InputStream的子類可以根據(jù)不同的數(shù)據(jù)源提供不同的實(shí)現(xiàn),例如FileInputStream用于從文件中讀取數(shù)據(jù),ByteArrayInputStream用于從字節(jié)數(shù)組中讀取數(shù)據(jù),SocketInputStream用于從網(wǎng)絡(luò)連接中讀取數(shù)據(jù)等。
對(duì)于InputStream,主要講解FileInputStream
public static void main(String[] args) throws FileNotFoundException {
InputStream inputStream = new FileInputStream("文件路徑");
inputStream.close();
}
在創(chuàng)建實(shí)例時(shí),要傳入一個(gè)文件路徑.這里需要處理一個(gè)異常FileNotFoundException
(文件沒找到).
讀文件需要先打開文件,打開才能讀,讀完之后要關(guān)閉文件(close)
InputStream類的常用方法為read()和close()
方法
close()方法:關(guān)閉輸入流,釋放與之關(guān)聯(lián)的資源。
而read()方法有三個(gè)版本:
- int read():從輸入流中讀取數(shù)據(jù)的下一個(gè)字節(jié),并返回讀取到的字節(jié)值。如果已經(jīng)到達(dá)流的末尾,則返回-1。
- int read(byte[] b):從輸入流中最多讀取b.length個(gè)字節(jié),并將其存儲(chǔ)在字節(jié)數(shù)組b中。返回實(shí)際讀取的字節(jié)數(shù)量。如果已經(jīng)到達(dá)流的末尾,則返回-1。
- int read(byte b[], int off, int len): 從輸入流中讀取最多l(xiāng)en個(gè)字節(jié),并將其存儲(chǔ)在從偏移量off開始的字節(jié)數(shù)組b中。
4.OutputStream
OutputStream的子類可以根據(jù)不同的目的地提供不同的實(shí)現(xiàn),例如FileOutputStream用于向文件中寫入數(shù)據(jù),ByteArrayOutputStream用于向字節(jié)數(shù)組中寫入數(shù)據(jù),SocketOutputStream用于向網(wǎng)絡(luò)連接中寫入數(shù)據(jù)等。
對(duì)于OutputStream,主要講解FileOutputStream
public static void main(String[] args) throws IOException {
OutputStream outputStream = new FileOutputStream("文件路徑");
outputStream.close();
}
close()方法: 關(guān)閉輸出流,釋放資源.
OutputStream中的一個(gè)常用方法: write()
:
這里有三個(gè)重載的版本
- write(int b):寫入一個(gè)字節(jié)到輸出流中。b是一個(gè)整數(shù),表示要寫入的字節(jié)的值(范圍是0~255)。
- write(byte[] b):將整個(gè)字節(jié)數(shù)組b寫入輸出流中。
- write(byte[] b, int off, int len):將字節(jié)數(shù)組b中從偏移量off開始的len個(gè)字節(jié)寫入輸出流中。
注意:使用OutputStream寫文件時(shí),只要文件打開成功,就會(huì)把文件原有的內(nèi)容清空.
5.Reader
Reader的子類可以根據(jù)不同的字符輸入源提供不同的實(shí)現(xiàn),例如FileReader用于從文件中讀取字符數(shù)據(jù),StringReader用于從字符串中讀取字符數(shù)據(jù),BufferedReader用于從字符緩沖區(qū)中讀取字符數(shù)據(jù)等。
使用方式于InputStream類似,只不過Reader是以字符流的形式進(jìn)行讀文件
public static void main(String[] args) throws IOException {
Reader reader = new FileReader("");
reader.close();
}
- read():讀取單個(gè)字符,并返回其Unicode值。如果已到達(dá)流的末尾,則返回-1。
- read(char[] cbuf):將字符讀入到指定的字符數(shù)組cbuf中,并返回讀取的字符數(shù)。
- read(char[] cbuf, int off, int len):將字符讀入到指定的字符數(shù)組cbuf中,從偏移量off開始,最多讀取len個(gè)字符,并返回實(shí)際讀取的字符數(shù)。
- read(CharBuffer target):將字符讀入到指定的CharBuffer對(duì)象中,并返回讀取的字符數(shù)。
6.Writer
Writer是用于向字符輸出流中寫入字符數(shù)據(jù)。
Writer的子類可以根據(jù)不同的字符輸出目的地提供不同的實(shí)現(xiàn),例如FileWriter用于向文件中寫入字符數(shù)據(jù),StringWriter用于向字符串中寫入字符數(shù)據(jù),BufferedWriter用于向字符緩沖區(qū)中寫入字符數(shù)據(jù)等。
- write(int c):將指定的字符寫入輸出流中。
- write(String str):將字符串寫入輸出流中。
- write(char[] cbuf):將字符數(shù)組中的字符寫入輸出流中。
- write(String str, int off, int len):將字符串中從偏移量off開始的len個(gè)字符寫入輸出流中。
- write(char[] cbuf, int off, int len):將字符數(shù)組中從偏移量off開始的len個(gè)字符寫入輸出流中。
7.使用Scanner讀文件
追對(duì)于文本文件,也可以使用Scanner進(jìn)行讀取
例如這里有一個(gè)test.txt文件
接下來介紹使用Scanner進(jìn)行讀文件
public class Demo5 {
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("test.txt");
Scanner scanner = new Scanner(inputStream);
while (scanner.hasNext()){
System.out.println(scanner.next());
}
inputStream.close();
}
}
運(yùn)行結(jié)果:
解釋一下:InputStream是字節(jié)流,Scanner是在InputStream的基礎(chǔ)上,包裝出來的字符流.
8.使用PrintWriter寫文件
與Scanner進(jìn)行讀文件類似,通過將FileOutputStream對(duì)象作為參數(shù),創(chuàng)建了一個(gè)PrintWriter對(duì)象printWriter。
PrintWriter類提供了一系列的print和println方法,用于以友好的方式輸出數(shù)據(jù)。這些方法可以接受不同類型的數(shù)據(jù)作為參數(shù),并將其轉(zhuǎn)換為字符串并寫入輸出流中。
例如,常用的方法包括:
- print(boolean b) / println(boolean b):以字符串形式寫入一個(gè)boolean值。
- print(char c) / println(char c):以字符串形式寫入一個(gè)字符。
- print(int i) / println(int i):以字符串形式寫入一個(gè)整數(shù)。
- print(double d) / println(double d):以字符串形式寫入一個(gè)雙精度浮點(diǎn)數(shù)。
- print(String s) / println(String s):寫入一個(gè)字符串。
- printf(String format, Object… args):使用指定的格式字符串和參數(shù)進(jìn)行格式化輸出。
需要注意的是,在使用完P(guān)rintWriter后,需要調(diào)用close()
方法關(guān)閉流,以確保數(shù)據(jù)被正確地寫入目的地并釋放資源。
代碼:
public class Demo6 {
public static void main(String[] args) throws IOException {
OutputStream outputStream = new FileOutputStream("test.txt");
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.printf("hello PrintWriter");
printWriter.close();
outputStream.close();
}
}
運(yùn)行結(jié)果:
9.close()方法
上述輸入流和輸出流的讀文件和寫文件后,都要進(jìn)行close.是為什么呢?
原因是 每個(gè)進(jìn)程都對(duì)應(yīng)者PCB(可能是多個(gè)),PCB里有一個(gè)字段,文件描述符表(同一個(gè)進(jìn)程里有多個(gè)PCB共同使用同一份文件描述符表),進(jìn)程沒打開一個(gè)文件,就會(huì)在文件描述表中創(chuàng)建一個(gè)項(xiàng)表示 一個(gè)文件.關(guān)閉文件意味著釋放文件描述表中的項(xiàng).如果不關(guān)閉文件,表項(xiàng)就在這里占著位置. 如果持續(xù)打開文件,不關(guān)閉,文件描述符表中的項(xiàng)就會(huì)被耗盡,從而導(dǎo)致后續(xù)打開文件失敗. 這也稱
"文件資源泄漏"
為了避免上述問題,就需要保證close方法一定能被執(zhí)行到.
因此就可以使用 try,finally保證close方法一定被執(zhí)行到
public static void main(String[] args) throws IOException {
Writer writer = null;
try {
writer = new FileWriter("文件路徑");
// do something
} finally {
writer.close();
}
}
除了上述這種寫法,還有一種寫法(try with resources
)
public static void main(String[] args) throws IOException {
try(Writer writer = new FileWriter("文件路徑")) {
// do something
}
}
當(dāng)try中的代碼執(zhí)行結(jié)束,就會(huì)自動(dòng)調(diào)用對(duì)應(yīng)對(duì)象的close方法.而且()中可以放多個(gè)對(duì)象,對(duì)象之間用;
進(jìn)行分割
10.flush()方法
flush()方法是Java IO流中的一個(gè)方法,用于刷新緩沖區(qū),并確保數(shù)據(jù)被寫入到目的地。
緩沖區(qū)(Buffer)是用于臨時(shí)存儲(chǔ)數(shù)據(jù)的一塊內(nèi)存區(qū)域,它可以提高IO操作的效率。
在Java的IO流中,使用緩沖區(qū)可以減少單次IO操作的次數(shù),從而提高讀取和寫入數(shù)據(jù)的效率。通常情況下,IO流會(huì)使用內(nèi)部的緩沖區(qū)來存儲(chǔ)數(shù)據(jù),然后在一定條件下將緩沖區(qū)中的數(shù)據(jù)進(jìn)行讀取或?qū)懭搿?/p>
在Java的輸出流(OutputStream/Writer)中,flush()方法的作用是將緩沖區(qū)中的數(shù)據(jù)強(qiáng)制刷新到目的地。通常情況下,輸出流會(huì)使用內(nèi)部的緩沖區(qū)來提高寫入效率,即將數(shù)據(jù)先寫入到緩沖區(qū)中,然后再一次性寫入到目的地。而flush()方法的調(diào)用可以讓輸出流立即將緩沖區(qū)的數(shù)據(jù)寫入到目的地,而不是等到緩沖區(qū)滿或流關(guān)閉時(shí)才寫入。
注: 調(diào)用close()方法也會(huì)刷新緩沖區(qū),并確保所有數(shù)據(jù)都被寫入
11.總結(jié)
Java IO流主要涉及以下類:
- InputStream和OutputStream:字節(jié)流的基類,用于讀取和寫入字節(jié)數(shù)據(jù)。
- Reader和Writer:字符流的基類,用于讀取和寫入字符數(shù)據(jù)。
- FileInputStream和FileOutputStream:用于從文件中讀取和寫入字節(jié)數(shù)據(jù)。
- FileReader和FileWriter:用于從文件中讀取和寫入字符數(shù)據(jù)。
同時(shí)可以使用Scanner和PrintWriter簡(jiǎn)化開發(fā),使用完流對(duì)象后,一定要記得調(diào)用close操作.文章來源:http://www.zghlxwxcb.cn/news/detail-616064.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-616064.html
到了這里,關(guān)于【Java|基礎(chǔ)篇】File類和IO流的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!