Java中對(duì)IO流的全面解析
一.IO流的類別
IO流分為字符流和字節(jié)流兩種:
字符流:一般指文本,我們能讀的懂的都可以認(rèn)為是字符流。比如:文章,java文件等等。
字節(jié)流:指二進(jìn)制的數(shù)據(jù),這種數(shù)據(jù)一般用文本打開(kāi)我們讀不懂。比如圖片文件,mp3文件等等。

二.字符流
字符流適合處理文本文件,支持字符編碼,能夠高效地讀寫(xiě)文本數(shù)據(jù)。
字符輸入流(Reader)用于讀取文本數(shù)據(jù),常用類包括 FileReader 和 BufferedReader。
字符輸出流(Writer)用于寫(xiě)入文本數(shù)據(jù),常用類包括 FileWriter 和 BufferedWriter。
1.字符輸入流
字符輸入流用于從數(shù)據(jù)源(如文件、字符串等)讀取字符數(shù)據(jù)。Reader 是所有字符輸入流的抽象基類。
FileReader :用于從文件中讀取字符數(shù)據(jù)。
InputStreamReader:將字節(jié)流轉(zhuǎn)換為字符流,可以指定字符編碼。
BufferedReader:提供緩沖功能,提高讀取效率,支持按行讀取。
import java.io.*;
public class Main {
public static void main(String[] args) {
// 使用 FileReader 讀取文件
try (FileReader reader = new FileReader("D:\\a.txt")) {
int data;
while ((data = reader.read()) != -1) {
System.out.print((char) data); // 逐個(gè)字符讀取
}
} catch (IOException e) {
e.printStackTrace();
}
// 使用 InputStreamReader 讀取文件
try (InputStreamReader reader = new InputStreamReader(new FileInputStream("D:\\a.txt"), "UTF-8")) {
int data;
while ((data = reader.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
// 使用 BufferedReader 按行讀取文件
try (BufferedReader br = new BufferedReader(new FileReader("D:\\a.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line); // 逐行讀取
}
} catch (IOException e) {
e.printStackTrace();
}
}
}2.字符輸出流
字符輸出流用于將字符數(shù)據(jù)寫(xiě)入目標(biāo)(如文件、控制臺(tái)等)。Writer 是所有字符輸出流的抽象基類。
FileWriter:用于將字符數(shù)據(jù)寫(xiě)入文件。
OutputStreamWriter:將字符流轉(zhuǎn)換為字節(jié)流,可以指定字符編碼。
BufferedWriter:提供緩沖功能,提高寫(xiě)入效率,支持按行寫(xiě)入。
import java.io.*;
public class Main {
public static void main(String[] args) {
// 使用 FileWriter 寫(xiě)入文件
try{
FileWriter writer = new FileWriter("output.txt");
writer.write("Hello, World!"); // 寫(xiě)入字符串
writer.write("\nThis is a new line."); // 寫(xiě)入換行符
writer.close(); //這個(gè)很重要沒(méi)有這個(gè)數(shù)據(jù)寫(xiě)入不進(jìn)去
} catch (IOException e) {
e.printStackTrace();
}
try {
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("output.txt"));
writer.write("Hello, World!"); // 寫(xiě)入字符串
writer.write("\nThis is a new line."); // 寫(xiě)入換行符
writer.close(); //這個(gè)很重要沒(méi)有這個(gè)數(shù)據(jù)寫(xiě)入不進(jìn)去
}catch (IOException e){
e.printStackTrace();
}
// 使用 BufferedWriter 按行寫(xiě)入文件
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write("Hello, World!"); // 寫(xiě)入字符串
bw.newLine(); // 寫(xiě)入換行符
bw.write("This is a new line."); // 寫(xiě)入另一行
} catch (IOException e) {
e.printStackTrace();
}
}
}一定要注意寫(xiě)上writer.close();
3.Writer常用的五種寫(xiě)入方法
(1)write(int c)
功能:寫(xiě)入單個(gè)字符。
參數(shù):c 是要寫(xiě)入的字符(以 int 形式表示,低 16 位有效)。
(2)write(char[] cbuf)
功能:寫(xiě)入字符數(shù)組中的所有字符
參數(shù):cbuf 是要寫(xiě)入的字符數(shù)組。
(3)write(char[] cbuf, int off, int len)
功能:寫(xiě)入字符數(shù)組的一部分。
參數(shù):cbuf:字符數(shù)組。
off:起始偏移量(從數(shù)組的哪個(gè)位置開(kāi)始寫(xiě)入)。
len:要寫(xiě)入的字符數(shù)。
(4)write(String str)
功能:寫(xiě)入字符串。
參數(shù):str 是要寫(xiě)入的字符串。
(5)write(String str, int off, int len)
功能:寫(xiě)入字符串的一部分。
參數(shù):str:字符串。
off:起始偏移量(從字符串的哪個(gè)位置開(kāi)始寫(xiě)入)。
len:要寫(xiě)入的字符數(shù)。
// 1. 寫(xiě)入單個(gè)字符
writer.write('H');
// 2. 寫(xiě)入字符數(shù)組
char[] array = {'e', 'l', 'l', 'o'};
writer.write(array);
// 3. 寫(xiě)入字符數(shù)組的一部分
writer.write(array, 1, 2); // 寫(xiě)入 "ll"
// 4. 寫(xiě)入字符串
writer.write(", World!");
// 5. 寫(xiě)入字符串的一部分
String str = "\nThis is Java IO.";
writer.write(str, 0, 11); // 寫(xiě)入 "This is Java"三.字節(jié)流
1.字節(jié)輸入流
InputStream 是所有字節(jié)輸入流的抽象基類,它定義了讀取字節(jié)數(shù)據(jù)的基本方法。
FileInputStream(File file): 通過(guò)打開(kāi)與實(shí)際文件的連接來(lái)創(chuàng)建一個(gè) FileInputStream ,該文件由文件系統(tǒng)中的 File對(duì)象 file命名。
FileInputStream(String name): 通過(guò)打開(kāi)與實(shí)際文件的連接來(lái)創(chuàng)建一個(gè) FileInputStream ,該文件由文件系統(tǒng)中的路徑名 name命名。
常用方法:(1)int read():從輸入流中讀取一個(gè)字節(jié)的數(shù)據(jù),返回值為讀取的字節(jié)(范圍是 0 - 255),如果到達(dá)流的末尾則返回 -1。
(2)int read(byte[] b):從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組 b 中,返回實(shí)際讀取的字節(jié)數(shù),如果到達(dá)流的末尾則返回 -1。
(3)int read(byte[] b, int off, int len):從輸入流中讀取最多 len 個(gè)字節(jié)的數(shù)據(jù),并將其存儲(chǔ)在數(shù)組 b 中,從偏移量 off 開(kāi)始存儲(chǔ),返回實(shí)際讀取的字節(jié)數(shù),如果到達(dá)流的末尾則返回 -1。
(4)void close():關(guān)閉此輸入流并釋放與之關(guān)聯(lián)的所有系統(tǒng)資源。
import java.io.*;
public class FileInputStreamTest {
public static void main(String[] args) {
//定義輸入流
FileInputStream fis =null;
try {
//1、創(chuàng)建文件對(duì)象
File file = new File("D:\\IO\\hello.txt");
//2、創(chuàng)建輸入流對(duì)象
fis = new FileInputStream(file);
//用定義字節(jié)數(shù)組,作為裝字節(jié)數(shù)據(jù)的容器
byte[] buffer =new byte[5];
int len;//記錄每次讀取的字節(jié)個(gè)數(shù)
System.out.println(fis.read(buffer));
while ((len=fis.read(buffer))!=-1){
//轉(zhuǎn)成String型,否則輸出ASCII碼
String str=new String(buffer,0,len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//釋放資源
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}2.字節(jié)輸出流
OutputStream是所有字節(jié)輸出流的父類,定義了所有字節(jié)輸出流都具有的共同特征。
FileOutputStream(File file):創(chuàng)建文件輸出流以寫(xiě)入由指定的 File對(duì)象表示的文件。
FileOutputStream(String name): 創(chuàng)建文件輸出流以指定的名稱寫(xiě)入文件。
FileOutputStream(String name,boolean append): 創(chuàng)建文件輸出流以指定的名稱寫(xiě)入文件,每次輸出文件是否繼續(xù)拼接。
常用方法:(1)void write(byte b):把一個(gè)字節(jié)寫(xiě)入到文件中。
(2)void write(byte[] b):把數(shù)組b 中的所有字節(jié)寫(xiě)入到文件中。
(3)void write(byte[] b,int off,int len):把數(shù)組b中的字節(jié)從 off 索引開(kāi)始的 len 個(gè)字節(jié)寫(xiě)入到文件中。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest {
public static void main (String[] args) {
//定義字節(jié)輸出流
FileOutputStream fos =null;
try {
//1、創(chuàng)建文件對(duì)象
File file = new File("D:\\IO\\hello.txt");
//2、創(chuàng)建輸出流對(duì)象
fos = new FileOutputStream(file);
fos.write(97);
//后面的 \r\n表示回車換行
fos.write("中國(guó)人!\r\n".getBytes());
//從索引2開(kāi)始輸出4個(gè)字節(jié)
fos.write("ABCDEFGH".getBytes(),2,4);
} catch (IOException e) {
e.printStackTrace();
} finally {
//釋放資源
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}到此這篇關(guān)于Java中Map.Entry鍵值對(duì)的概念與應(yīng)用實(shí)踐的文章就介紹到這了,更多相關(guān)Java中Map.Entry鍵值對(duì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 整合 Redis詳解從基礎(chǔ)操作到實(shí)戰(zhàn)應(yīng)用
文章介紹了SpringBoot整合Redis的必要性、步驟及核心數(shù)據(jù)類型,涵蓋分布式鎖、緩存注解等高級(jí)功能,并提供最佳實(shí)踐如鍵命名規(guī)范和內(nèi)存優(yōu)化,強(qiáng)調(diào)二者結(jié)合提升應(yīng)用性能與可擴(kuò)展性,感興趣的朋友跟隨小編一起看看吧2025-08-08
SpringBoot整合PowerJob實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度
最近項(xiàng)目需要使用定時(shí)任務(wù),而使用了PowerJob做任務(wù)調(diào)度模塊,感覺(jué)這個(gè)框架真香,今天我們就來(lái)深入了解一下新一代的定時(shí)任務(wù)框架——PowerJob,需要的朋友可以參考下2024-03-03
MyBatis-Plus 查詢返回實(shí)體對(duì)象還是map
這篇文章主要介紹了MyBatis-Plus 查詢返回實(shí)體對(duì)象還是map,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
springboot啟動(dòng)過(guò)程中常用的回調(diào)示例詳解
springboot提供非常豐富回調(diào)接口,利用這些接口可以做非常多的事情,本文通過(guò)實(shí)例代碼給大家介紹springboot啟動(dòng)過(guò)程中常用的回調(diào)知識(shí)感興趣的朋友跟隨小編一起看看吧2022-01-01
Fluent Mybatis學(xué)習(xí)之Update語(yǔ)法實(shí)踐
Fluent MyBatis是一個(gè)MyBatis的增強(qiáng)工具,沒(méi)有對(duì)mybatis做任何修改。本篇文章將詳細(xì)介紹對(duì)Fluent Mybatis中的update語(yǔ)法進(jìn)行驗(yàn)證。代碼具有一定價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2021-11-11
SpringAop @Aspect織入不生效,不執(zhí)行前置增強(qiáng)織入@Before方式
這篇文章主要介紹了SpringAop @Aspect織入不生效,不執(zhí)行前置增強(qiáng)織入@Before方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java中List按自定義順序排序的幾種實(shí)現(xiàn)過(guò)程
文章介紹Java中按省份自定義排序的三種方法:Map(高效易維護(hù))、Enum(類型安全可擴(kuò)展)、List.indexOf(簡(jiǎn)潔但效率低),推薦根據(jù)數(shù)據(jù)量和需求選擇,大數(shù)據(jù)量?jī)?yōu)先Map或Enum,小數(shù)據(jù)量可用List.indexOf,強(qiáng)調(diào)代碼可讀性和維護(hù)性2025-07-07
SpringBoot之Order注解啟動(dòng)順序說(shuō)明
這篇文章主要介紹了SpringBoot之Order注解啟動(dòng)順序說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

