目錄
前言:
IO流介紹:
IO流的常見(jiàn)方法:
1.字節(jié)流類(lèi):
2.字符流類(lèi):
總結(jié):
前言:
? ? ? ? ? ? ? ? IO流就是存入和讀取數(shù)據(jù)的解決方案,并且他是一個(gè)知識(shí)點(diǎn)很多的章節(jié),因此我們關(guān)于IO流的介紹會(huì)分為多篇來(lái)進(jìn)行詳解,而掌握好IO流可以大大提高我們的效率,簡(jiǎn)化我們的代碼執(zhí)行效率。
IO流介紹:
在前文我們知道,如果我們想要實(shí)現(xiàn)對(duì)于程序的存檔功能,就一共需要實(shí)現(xiàn)兩個(gè)功能:
1.將數(shù)據(jù)存到文件當(dāng)中,這也就是我們上一篇文章File類(lèi)的作用
2.實(shí)現(xiàn)程序?qū)ξ募?shù)據(jù)的讀取功能,這也就是我們接下來(lái)幾篇所介紹的IO流的作用
在Java中,IO流(Input/Output Stream)是用于處理輸入和輸出的機(jī)制。它提供了讀寫(xiě)數(shù)據(jù)的方式,允許程序與文件、網(wǎng)絡(luò)等交互。Java中的IO流分為字節(jié)流和字符流兩種類(lèi)型。
字節(jié)流操作以字節(jié)為單位進(jìn)行輸入和輸出。字節(jié)流主要由InputStream和OutputStream兩個(gè)抽象類(lèi)及其各種實(shí)現(xiàn)類(lèi)組成。常見(jiàn)的字節(jié)流類(lèi)包括FileInputStream、FileOutputStream、ByteArrayInputStream、ByteArrayOutputStream等。
字符流操作以字符為單位進(jìn)行輸入和輸出,它可以直接操作Unicode字符。字符流主要由Reader和Writer兩個(gè)抽象類(lèi)及其各種實(shí)現(xiàn)類(lèi)組成。常見(jiàn)的字符流類(lèi)包括FileReader、FileWriter、BufferedReader、BufferedWriter等。
?字節(jié)流可以操作所有類(lèi)型的文件,字符流只能操作純文本文件。
IO流的常見(jiàn)方法:
1.字節(jié)流類(lèi):
1.FileOutputStream
FileOutputStream是Java IO庫(kù)中用于將數(shù)據(jù)寫(xiě)入文件的字節(jié)輸出流。它繼承自O(shè)utputStream類(lèi)并添加了一些特定于文件輸出的方法。通過(guò)FileOutputStream,我們可以將字節(jié)數(shù)據(jù)寫(xiě)入本地文件,可以是單個(gè)字節(jié),字節(jié)數(shù)組或部分字節(jié)數(shù)組。
使用FileOutputStream的基本步驟如下:
-
創(chuàng)建FileOutputStream對(duì)象:通過(guò)調(diào)用FileOutputStream的構(gòu)造函數(shù),指定要寫(xiě)入的文件路徑和文件名稱(chēng)。例如:
FileOutputStream fos = new FileOutputStream("file.txt");
-
寫(xiě)入數(shù)據(jù):使用FileOutputStream提供的write()方法將數(shù)據(jù)寫(xiě)入文件。有多個(gè)重載的write()方法可以使用。常見(jiàn)的方法包括:
-
void write(int b)
:將指定的字節(jié)寫(xiě)入文件。 -
void write(byte[] b)
:將指定字節(jié)數(shù)組中的所有數(shù)據(jù)寫(xiě)入文件。 -
void write(byte[] b, int off, int len)
:將指定字節(jié)數(shù)組中的部分?jǐn)?shù)據(jù)寫(xiě)入文件,參數(shù)off表示數(shù)組的起始位置,參數(shù)len表示要寫(xiě)入的字節(jié)數(shù)。
例如,使用write(byte[])方法將字符串?dāng)?shù)據(jù)寫(xiě)入文件:
String data = "Hello, World!"; byte[] bytes = data.getBytes(); fos.write(bytes);
-
-
刷新數(shù)據(jù):如果需要將數(shù)據(jù)立即寫(xiě)入磁盤(pán)而不是等待緩沖區(qū)滿(mǎn)或關(guān)閉流時(shí)才寫(xiě)入,可以調(diào)用flush()方法。例如:
fos.flush();
-
關(guān)閉流:使用完畢后,務(wù)必關(guān)閉FileOutputStream以釋放資源。可以使用close()方法關(guān)閉。例如:
fos.close();
完整的示例代碼如下:
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamExample {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("file.txt");
String data = "Hello, World!";
byte[] bytes = data.getBytes();
fos.write(bytes);
fos.flush();
fos.close();
System.out.println("Data has been written to the file.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileOutputStream還提供了其他一些方法,如getFD()用于獲取與流關(guān)聯(lián)的文件描述符,以及在特定位置寫(xiě)入數(shù)據(jù)的seek()方法等。
需要注意的是,使用FileOutputStream時(shí)可能會(huì)拋出IOException或FileNotFoundExceptio等異常,因此在使用時(shí)要進(jìn)行適當(dāng)?shù)漠惓L幚怼?/span>
2.FileInputStream
FileInputStream是Java IO庫(kù)中用于從文件中讀取數(shù)據(jù)的字節(jié)輸入流。它繼承自InputStream類(lèi),并提供了一些特定于文件輸入的方法。通過(guò)FileInputStream,我們可以從文件中讀取字節(jié)數(shù)據(jù),可以是單個(gè)字節(jié),也可以是一組字節(jié)。
使用FileInputStream的基本步驟如下:
-
創(chuàng)建FileInputStream對(duì)象:通過(guò)調(diào)用FileInputStream的構(gòu)造函數(shù),指定要讀取的文件路徑和文件名稱(chēng)。例如:
FileInputStream fis = new FileInputStream("file.txt");
-
讀取數(shù)據(jù):使用FileInputStream提供的read()方法來(lái)讀取數(shù)據(jù)。有多個(gè)重載的read()方法可以使用。常見(jiàn)的方法包括:
-
int read()
:讀取一個(gè)字節(jié)的數(shù)據(jù)并返回該字節(jié)數(shù)據(jù)的整數(shù)表示(0-255),當(dāng)?shù)竭_(dá)文件末尾時(shí)返回-1。 -
int read(byte[] b)
:從文件中讀取一定數(shù)量的字節(jié),并將其存儲(chǔ)在指定的字節(jié)數(shù)組b中,并返回實(shí)際讀取的字節(jié)數(shù)。讀取到文件末尾時(shí)返回-1。 -
int read(byte[] b, int off, int len)
:從文件中讀取最多l(xiāng)en個(gè)字節(jié)到指定的字節(jié)數(shù)組b中,從數(shù)組的偏移量off開(kāi)始,并返回實(shí)際讀取的字節(jié)數(shù)。讀取到文件末尾時(shí)返回-1。
例如,使用read(byte[])方法讀取文件中的數(shù)據(jù)并將其打印到控制臺(tái):
FileInputStream fis = new FileInputStream("file.txt"); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { System.out.write(buffer, 0, bytesRead); }
-
-
關(guān)閉流:使用完畢后,務(wù)必關(guān)閉FileInputStream以釋放資源??梢允褂胏lose()方法關(guān)閉。例如:
fis.close();
完整的示例代碼如下:
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamExample {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("file.txt");
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
System.out.write(buffer, 0, bytesRead);
}
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream還提供了其他一些方法,例如available()返回還剩下多少可讀取的字節(jié)數(shù),skip(long n)用于跳過(guò)指定數(shù)量的字節(jié)等。
需要注意的是,使用FileInputStream時(shí)可能會(huì)拋出IOException或FileNotFoundException等異常,因此在使用時(shí)要進(jìn)行適當(dāng)?shù)漠惓L幚怼?/p>
2.字符流類(lèi):
字符流可以用來(lái)解決讀碼問(wèn)題,因?yàn)闈h字的編碼并不是一個(gè)字節(jié)大小,而如果我們?cè)谧x碼的時(shí)候按照字節(jié)流進(jìn)行輸出的話(huà),就會(huì)錯(cuò)誤的把漢字編碼轉(zhuǎn)化成為亂碼,因此我們?cè)O(shè)計(jì)了字符流,使得讀碼的時(shí)候不是按照字節(jié)來(lái)讀取,而是字符。
在Java中,字符流類(lèi)是用于讀取和寫(xiě)入字符數(shù)據(jù)的類(lèi)集合。它們都位于java.io包中,常用的字符流類(lèi)包括:
-
FileReader和FileWriter:用于讀取和寫(xiě)入字符文件的字符流類(lèi)。
- FileReader:用于讀取字符文件(如文本文件)。它以字符為單位讀取文件的內(nèi)容。
- FileWriter:用于寫(xiě)入字符文件(如文本文件)。它以字符為單位將數(shù)據(jù)寫(xiě)入文件。
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharacterStreamsExample {
public static void main(String[] args) {
try {
// 創(chuàng)建FileReader對(duì)象并指定要讀取的文件路徑
FileReader reader = new FileReader("input.txt");
// 創(chuàng)建FileWriter對(duì)象并指定要寫(xiě)入的文件路徑
FileWriter writer = new FileWriter("output.txt");
int character;
// 逐字符讀取文件內(nèi)容并寫(xiě)入到輸出文件中
while ((character = reader.read()) != -1) {
writer.write(character);
}
// 關(guān)閉流
reader.close();
writer.close();
System.out.println("文件復(fù)制完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
-
BufferedReader和BufferedWriter:提供了緩沖功能,加速字符輸入輸出操作。
- BufferedReader:用于讀取字符數(shù)據(jù),并提供了緩沖功能,可以提高讀取效率。
- BufferedWriter:用于寫(xiě)入字符數(shù)據(jù),并提供了緩沖功能,可以提高寫(xiě)入效率。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedCharacterStreamsExample {
public static void main(String[] args) {
try {
// 創(chuàng)建BufferedReader對(duì)象并指定要讀取的文件路徑
BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
// 創(chuàng)建BufferedWriter對(duì)象并指定要寫(xiě)入的文件路徑
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
String line;
// 逐行讀取文件內(nèi)容并寫(xiě)入到輸出文件中
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine(); // 寫(xiě)入換行符
}
// 關(guān)閉流
reader.close();
writer.close();
System.out.println("文件復(fù)制完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
-
InputStreamReader和OutputStreamWriter:用于處理字節(jié)流和字符流之間的轉(zhuǎn)換。
- InputStreamReader:將字節(jié)流轉(zhuǎn)換為字符流。它可以指定字符集,將字節(jié)解碼為字符。
- OutputStreamWriter:將字符流轉(zhuǎn)換為字節(jié)流。它可以指定字符集,將字符編碼為字節(jié)。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class EncodingExample {
public static void main(String[] args) {
try {
// 使用InputStreamReader將字節(jié)流轉(zhuǎn)換為字符流
FileInputStream fis = new FileInputStream("input.txt");
InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
int data;
while ((data = reader.read()) != -1) {
System.out.print((char) data);
}
reader.close();
// 使用OutputStreamWriter將字符流轉(zhuǎn)換為字節(jié)流
FileOutputStream fos = new FileOutputStream("output.txt");
OutputStreamWriter writer = new OutputStreamWriter(fos, "UTF-8");
writer.write("你好,世界!");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
總結(jié):
? ? ? ? 本文我們介紹了IO流中的兩大類(lèi):字節(jié)流和字符流類(lèi)的使用方法,在實(shí)際的代碼書(shū)寫(xiě)中,我們也要根據(jù)實(shí)際情況來(lái)確定哪一個(gè)更加適合。
如果我的內(nèi)容對(duì)你有幫助,請(qǐng)點(diǎn)贊,評(píng)論,收藏。創(chuàng)作不易,大家的支持就是我堅(jiān)持下去的動(dòng)力!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-643585.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-643585.html
到了這里,關(guān)于【從零開(kāi)始學(xué)習(xí)JAVA | 三十四篇】IO流的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!