Java IO(File、字節(jié)輸入輸出流、字符輸入輸出流、打印流)附帶相關(guān)面試題

1.File類
file類專門用于管理file文件的,比如文件的創(chuàng)建,刪除,修改名稱等等
以下是File類的常用方法:
方法描述
exists()
判斷文件或目錄是否存在canRead()
判斷文件是否可讀canWrite()
判斷文件是否可寫isFile()
判斷路徑是否表示一個(gè)文件isDirectory()
判斷路徑是否表示一個(gè)目錄getName()
獲取文件或目錄的名稱getParent()
獲取文件或目錄的父級路徑createNewFile()
創(chuàng)建新文件delete()
刪除文件或目錄renameTo()
重命名文件或目錄list()
返回目錄下的文件和目錄列表listFiles()
返回目錄下的文件和目錄數(shù)組
?文件路徑需要掌握File.separator分隔符相當(dāng)于"\\",為什么要有這個(gè)東西呢?因?yàn)樵诓煌牟僮飨到y(tǒng)中路徑的分隔符并不一樣,由此出現(xiàn)File.separator,會(huì)根據(jù)自己的系統(tǒng)自動(dòng)轉(zhuǎn)換相應(yīng)的分隔符
1.使用案例:在一個(gè)路徑上,如果存在一個(gè)文件java.txt,則將其刪除,如果不存在則創(chuàng)建一個(gè)文件java.txt,再將其名字改為java.html并且輸出上次的修改日期

2.通過遞歸實(shí)現(xiàn)輸出C盤所有文件內(nèi)容
?*面試題Files的常用方法都有哪些?
exist、createFile、createDirectory、write、read、copy、size、delete、move

?2.字節(jié)輸入輸出流(InputStream Outputstream)
字節(jié)輸入輸出流的最基本單位是byte字節(jié),注意InputStream和OutputStream都是抽象類,所以實(shí)例化對象分別是其子類FileInputStream(File file)與FileOutputStream(File file)
首先介紹OutoutStream字節(jié)輸出流的常用方法:
方法描述
write(byte[] buffer)將byte數(shù)組中的數(shù)據(jù)寫入輸出流
write(byte[] buffer, int off, int len)將byte數(shù)組中指定范圍的數(shù)據(jù)寫入輸出流
write(int b)將單個(gè)字節(jié)寫入輸出流
flush()刷新輸出流,確保所有緩沖區(qū)中的數(shù)據(jù)都被寫出
close()關(guān)閉輸出流,并釋放相關(guān)資源
?InputStream的常用方法:
方法描述
read()讀取輸入流中的下一個(gè)字節(jié)
read(byte[] buffer)將輸入流中的數(shù)據(jù)讀入到byte數(shù)組中
read(byte[] buffer, int off, int len)將輸入流中的數(shù)據(jù)讀入到指定范圍的byte數(shù)組中
skip(long n)跳過并丟棄輸入流中的n個(gè)字節(jié)
available()返回可以從輸入流中讀?。ɑ蛱^)的字節(jié)數(shù)
close()關(guān)閉輸入流,并釋放相關(guān)資源
案例代碼:
實(shí)現(xiàn)在java.txt中通過OutputStream的wirte函數(shù)實(shí)現(xiàn)第一次覆蓋內(nèi)容實(shí)現(xiàn)輸入Hello,第二次實(shí)現(xiàn)追加在Hello后面加入World

?注意在創(chuàng)建實(shí)例化對象執(zhí)行完函數(shù)后都要進(jìn)行close();除非使用AutoCloseable接口
?案例2:在剛才基礎(chǔ)上讀取時(shí)候跳過Hello

3.Writer與Reader字符輸入輸出流
1.字符輸入流與字節(jié)輸入流有什么區(qū)別:
數(shù)據(jù)單位:字節(jié)流以字節(jié)為單位進(jìn)行輸入和輸出,而字符流以字符為單位進(jìn)行輸入和輸出。字符流可以直接處理Unicode字符,而字節(jié)流需要通過字符編碼和解碼來處理文本數(shù)據(jù)。
編碼支持:字符流默認(rèn)使用平臺默認(rèn)的字符編碼(如UTF-8),并提供了更多的字符編碼支持(如UTF-16、ISO-8859-1等)。字節(jié)流不關(guān)心編碼,只是原樣傳輸字節(jié)數(shù)據(jù)。
數(shù)據(jù)處理:字符流提供了更高級別的數(shù)據(jù)處理功能,能夠方便地讀取和寫入文本數(shù)據(jù),包括按行讀取、字符緩沖等操作。字節(jié)流主要用于二進(jìn)制數(shù)據(jù)的讀寫,處理相對底層。
效率:由于字符流需要進(jìn)行字符編碼和解碼,所以在處理大量數(shù)據(jù)時(shí)可能會(huì)比字節(jié)流略慢。對于文本數(shù)據(jù)的處理,字符流的效率通常比較高。
綜上所述,字符流更適合處理文本數(shù)據(jù),提供了更多的字符編碼支持和便捷的高級功能;而字節(jié)流適用于處理二進(jìn)制數(shù)據(jù),更為底層和靈活。選擇使用哪種流類型取決于具體的輸入/輸出需求和數(shù)據(jù)類型。
2.Writer與Reader也都是抽象類,所以實(shí)例化的時(shí)候需要向上轉(zhuǎn)型為其子類,FileWriter與FileReader
Writer的常用方法:
方法描述
write(int c)將指定字符寫入輸出流
write(char[] cbuf)將字符數(shù)組的所有字符寫入輸出流
write(String str)將字符串中的所有字符寫入輸出流
write(String str, int off, int len)將字符串中指定范圍的字符寫入輸出流
append(CharSequence csq)將指定的字符序列追加到輸出流
append(CharSequence csq, int start, int end)將指定范圍的字符序列追加到輸出流
flush()刷新輸出流,將緩沖區(qū)的數(shù)據(jù)寫入目標(biāo)設(shè)備
close()關(guān)閉輸出流,并釋放相關(guān)資源
案例代碼1:

?案例代碼2:
面試題java 中 IO 流分為幾種?
(1)按流劃分,可以分為輸入流和輸出流;
(2)按單位劃分,可以分為字節(jié)流和字符流;
字節(jié)流:inputStream、outputStream;
字符流:reader、writer

?4.打印流
雖然說io中對數(shù)據(jù)的輸出可以通過OutputStream與Writer,但是兩者都有一定的限制,比如OutputStream只允許輸出字節(jié)數(shù)據(jù),Writer只允許輸出字符數(shù)據(jù)和字符串?dāng)?shù)據(jù),在實(shí)際的開發(fā)過程會(huì)有多種數(shù)據(jù)類型的輸出就引出了PrintWriter
下面介紹PrintWriter的常用方法:
void print(boolean x)
將boolean值打印到輸出流void print(char x)
將字符打印到輸出流。void print(int x)
將整數(shù)打印到輸出流。void print(long x)
將長整數(shù)打印到輸出流。void print(float x)
將浮點(diǎn)數(shù)打印到輸出流。void print(double x)
將雙精度浮點(diǎn)數(shù)打印到輸出流。void print(char[] x)
將字符數(shù)組打印到輸出流。void print(String x)
將字符串打印到輸出流。void println()
打印一個(gè)換行符。void flush()
刷新輸出流,即將緩沖區(qū)的內(nèi)容寫入目標(biāo)設(shè)備。void close()
關(guān)閉輸出流,釋放相關(guān)資源。
?1.通過打印一個(gè)print.txt內(nèi)容為:
姓名:黃小龍
年齡15
案例代碼:

?構(gòu)造方法PrintWriter(File file)與PrintWriter(FileOutputStream out)有什么區(qū)別:
`PrintWriter(File file)` 和 `PrintWriter(FileOutputStream out)` 都創(chuàng)建了一個(gè)新的 `PrintWriter` 對象,用于寫入字符流。它們的區(qū)別在于它們的構(gòu)造函數(shù)參數(shù)類型不同。
`PrintWriter(File file)` 構(gòu)造函數(shù)接受一個(gè) `File` 對象作為參數(shù),表示要寫入的文件。當(dāng)您使用這個(gè)構(gòu)造函數(shù)創(chuàng)建一個(gè) `PrintWriter` 對象時(shí),它將自動(dòng)為您創(chuàng)建一個(gè) `FileOutputStream` 對象并將其與您指定的文件關(guān)聯(lián)。這意味著您可以直接向 `PrintWriter` 對象寫入字符,而不必手動(dòng)創(chuàng)建 `FileOutputStream` 對象。
例如,以下代碼使用 `PrintWriter(File file)` 構(gòu)造函數(shù)創(chuàng)建一個(gè)新的 `PrintWriter` 對象,并將其用于向 `example.txt` 文件寫入字符:
```java
File file = new File("example.txt");
PrintWriter writer = new PrintWriter(file);
writer.println("Hello, world!");
writer.close();
```相比之下,`PrintWriter(FileOutputStream out)` 構(gòu)造函數(shù)接受一個(gè) `FileOutputStream` 對象作為參數(shù),表示要與該對象關(guān)聯(lián)的輸出流。如果您已經(jīng)有一個(gè) `FileOutputStream` 對象,并且希望將其用作 `PrintWriter` 對象的輸出流,可以使用這個(gè)構(gòu)造函數(shù)。
例如,以下代碼創(chuàng)建一個(gè)新的 `FileOutputStream` 對象,并將其用作 `PrintWriter` 對象的輸出流:
```java
FileOutputStream outputStream = new FileOutputStream("example.txt");
PrintWriter writer = new PrintWriter(outputStream);
writer.println("Hello, world!");
writer.close();
```總之,這兩種構(gòu)造函數(shù)都可以用于創(chuàng)建一個(gè) `PrintWriter` 對象,但是它們的參數(shù)類型不同,并且在用法上略有不同。