Java中最全最基礎(chǔ)的IO流概述和簡(jiǎn)介案例分析

IO流簡(jiǎn)介
IO是什么
Java中的IO流是用于處理數(shù)據(jù)輸入和輸出的核心機(jī)制。通過應(yīng)用IO流可以使Java程序能夠與外部世界(如磁盤文件、網(wǎng)絡(luò)、硬件設(shè)備等)進(jìn)行數(shù)據(jù)交互。IO流的全稱為輸入/輸出流(Input/Output Stream),它是Java編程語(yǔ)言中用于數(shù)據(jù)傳輸?shù)囊环N抽象模型。流可以被想象為數(shù)據(jù)的連續(xù)流動(dòng),就像水通過管道一樣,數(shù)據(jù)通過流從一個(gè)地方流向另一個(gè)地方。

應(yīng)用場(chǎng)景
IO流在Java開發(fā)中幾乎無處不在,任何涉及到數(shù)據(jù)讀寫的地方都會(huì)用到IO流。常見的應(yīng)用場(chǎng)景包括文件讀寫、網(wǎng)絡(luò)通信、數(shù)據(jù)持久化等
IO流的分類
IO流的分類可以從多個(gè)維度進(jìn)行理解
- 按流的方向:可以分為輸入流InputStream)和輸出流(FileOutputStream)
- 按流的功能:可以分為節(jié)點(diǎn)流和處理流
- 按數(shù)據(jù)處理單元:可以分為字節(jié)流(以字節(jié)讀寫為基本單位)和字符流(以字符讀寫為基本單位)
流的超類類型
在Java中,輸入輸出(IO)流的超類主要有兩類,分別對(duì)應(yīng)于字節(jié)流和字符流.
- 字節(jié)流(Byte Streams)
- java.io.InputStream:所有字節(jié)輸入流的超類。定義了從源讀取字節(jié)的基本方法
- java.io.OutputStream:所有字節(jié)輸出流的超類。定義了向目的地寫入字節(jié)的基本方法
- 字符流(Character Streams)
- java.io.Reader:字符輸入流的超類,定義了從源讀取字符的基本方法
- java.io.Writer:字符輸出流的超類,定義了向目的地寫入字符的基本方法
這些超類提供了基本的讀寫操作,而它們的子類則實(shí)現(xiàn)了特定的讀寫功能,例如從文件讀取、向網(wǎng)絡(luò)套接字寫入、數(shù)據(jù)的緩沖等。例如:
- 字節(jié)流的具體實(shí)現(xiàn)包括:
- FileInputStream和FileOutputStream:用于讀寫文件。
- BufferedInputStream和BufferedOutputStream:提供緩沖,從而提高讀寫效率。
- ObjectInputStream和ObjectOutputStream:用于對(duì)象的序列化和反序列化。
- …
- 字符流的具體實(shí)現(xiàn)包括:
- FileReader和FileWriter:用于讀寫文本文件。
- BufferedReader和BufferedWriter、PrintWriter:提供字符緩沖,提高讀寫效率。
- InputStreamReader和OutputStreamWriter:用于在字節(jié)流和字符流之間轉(zhuǎn)換。
- …
這些類構(gòu)成了Java IO流的層次結(jié)構(gòu),允許開發(fā)者根據(jù)不同的需求選擇合適的流類型來進(jìn)行數(shù)據(jù)的讀寫操作。
字節(jié)文件流應(yīng)用
簡(jiǎn)介
文件流是用來連接我們的程序與文件之間的"管道",用來讀寫文件中的數(shù)據(jù)。
核心API
文件流是繼承自InputStream和OutputStream的流對(duì)象,其分類為:
- 文件輸入流java.io.FileInputStream:讀取文件數(shù)據(jù)的流
- 文件輸出流java.io.FileOutputStream:寫入文件數(shù)據(jù)的流
文件輸出流應(yīng)用
java.io.FileOutputStream輸出流對(duì)象用于向文件中寫入數(shù)據(jù),對(duì)象構(gòu)建通常會(huì)借助如下兩個(gè)構(gòu)造方法:
FileOutputStream(String path)
創(chuàng)建文件輸出流對(duì)指定的path路徑表示的文件進(jìn)行寫操作,如果該文件不存在則將其創(chuàng)建出來
FileOutputStream(File file)
創(chuàng)建文件輸出流對(duì)指定的file對(duì)象表示的文件進(jìn)行寫操作,如果該文件不存在則將其創(chuàng)建出來
案例
package io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
//API(工具-用于解決什么問題,怎么解決問題)
public class FOSDemo01 {
public static void main(String[] args) throws IOException {
//1.構(gòu)建一個(gè)文件輸出流對(duì)象
//1)創(chuàng)建文件對(duì)象
File file=new File("jsd/2406/fos.dat");//jsd/2406/是目錄
//2)獲取文件對(duì)象的目錄結(jié)構(gòu)
File parent = file.getParentFile();//jsd/2406/
System.out.println(parent);
//3).假如目錄不存在則創(chuàng)建目錄mkdirs();
if(!parent.exists()){//parent.exists()假如返回true表示存在
parent.mkdirs();//創(chuàng)建多層目錄
System.out.println("文件不存在,創(chuàng)建成功");
}
//4)創(chuàng)建文件輸出流對(duì)象(用于向文件寫數(shù)據(jù)-二進(jìn)制)
//構(gòu)建對(duì)象方法1
//FileOutputStream fos1=new FileOutputStream("jsd/2406/fos.dat");
//構(gòu)建對(duì)象方法2
FileOutputStream fos2=new FileOutputStream(file);
//5)向文件中寫入數(shù)據(jù)
fos2.write(3);//這里的3表示10進(jìn)制數(shù)據(jù),3的二進(jìn)制數(shù)據(jù)為 00000011
//0001 1(10進(jìn)制)
//0010 2
//0011 3
//0100 4
//0101 5
fos2.write(4);
fos2.write(5);
System.out.println("數(shù)據(jù)寫入OK");
//6)釋放資源(關(guān)閉流對(duì)象)
fos2.close();
}
}文件輸入流應(yīng)用
java.io.FileInputStream文件輸入流對(duì)象用于從文件中讀取數(shù)據(jù),常用構(gòu)造方法有:
FileInputStream(String path)
基于給定的路徑對(duì)應(yīng)的文件創(chuàng)建文件輸入流
FileInputStream(File file)
基于給定的File對(duì)象所表示的文件創(chuàng)建文件輸入流
案例
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 自己實(shí)踐:
* 構(gòu)建文件輸入流FileInputStream對(duì)象,并基于此對(duì)象
* 從jsd/2406/fos.dat文件中讀數(shù)據(jù)到程序中并輸出。
*/
public class FISDemo01 {
public static void main(String[] args) throws IOException {
//1.構(gòu)建文件輸入流對(duì)象
FileInputStream fis=new FileInputStream("jsd/2406/fos.dat");
//2.讀取數(shù)據(jù)
//int a = fis.read();//讀取一個(gè)字節(jié)
//int b = fis.read();
//int c = fis.read();
//int d = fis.read();
//System.out.println("a="+a+";b="+b+";c="+c+";d="+d);
int n=0;
while((n=fis.read())!=-1){
System.out.println(n);
}
//3.關(guān)閉流對(duì)象(水龍頭有打開是不是也會(huì)有關(guān)閉,否則浪費(fèi)資源)
fis.close();//流對(duì)象關(guān)閉后會(huì)釋放內(nèi)存
}
}文件的復(fù)制實(shí)踐
復(fù)制文件的原理就是使用文件輸入流從原文件中陸續(xù)讀取出每一個(gè)字節(jié),然后再使用文件輸出流將字節(jié)陸續(xù)寫入到另一個(gè)文件中完成的。
案例1
package io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 實(shí)現(xiàn)文件復(fù)制
* 將當(dāng)前目錄中的a.png文件復(fù)制一份出來生成一個(gè)b.png文件
*/
public class FileCopyDemo01 {
public static void main(String[] args) throws IOException {
//一、實(shí)現(xiàn)思路
//1.讀文件內(nèi)容(a.png)
//2.將讀取的內(nèi)容寫到b.png中
//二、代碼實(shí)現(xiàn)
//1.構(gòu)建文件輸入流、輸出流對(duì)象
FileInputStream fis=
new FileInputStream("a.png");//這個(gè)文件需要存在
FileOutputStream fos=
new FileOutputStream("b.png");//這個(gè)文件不存在會(huì)自動(dòng)創(chuàng)建
//2.讀寫數(shù)據(jù)(復(fù)制)
int n=-1;
while((n=fis.read())!=-1){//讀取數(shù)據(jù),n為讀到的數(shù)據(jù),-1表示讀取到文件尾
fos.write(n);//將讀取的數(shù)據(jù)寫入到b.png文件中
}
//3.關(guān)閉流對(duì)象
fis.close();
fos.close();
}
}塊讀寫操作實(shí)踐
- 塊讀:一次性讀取一組字節(jié)的方式
InputStream中定義了塊讀的方法
int read(byte[] data)
一次性讀取給定字節(jié)數(shù)組總長(zhǎng)度的字節(jié)量并存入到該數(shù)組中。
返回值為實(shí)際讀取到的字節(jié)數(shù)。如果返回值為-1表示本次沒有讀取到任何字節(jié)已經(jīng)是流的末尾了
- 塊寫:一次性寫出一組字節(jié)的方式
OutputStream中定義了塊寫的方法
void write(byte[] data)
一次性將給定數(shù)組中所有字節(jié)寫出
void write(byte[] data,int offset,int len)
一次性將data數(shù)組中從下標(biāo)offset處開始的連續(xù)len個(gè)字節(jié)一次性寫出
案例實(shí)現(xiàn):文件復(fù)制
package io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 實(shí)現(xiàn)文件復(fù)制
* 將當(dāng)前目錄中的a.png文件復(fù)制一份出來生成一個(gè)b.png文件
*/
public class FileCopyDemo02 {
public static void main(String[] args) throws IOException {
//一、實(shí)現(xiàn)思路
//1.讀文件內(nèi)容(a.png)
//2.將讀取的內(nèi)容寫到b.png中
//二、代碼實(shí)現(xiàn)
//1.構(gòu)建文件輸入流、輸出流對(duì)象
FileInputStream fis=
new FileInputStream("a.png");//這個(gè)文件需要存在
FileOutputStream fos=
new FileOutputStream("b.png");//這個(gè)文件不存在會(huì)自動(dòng)創(chuàng)建
//2.讀寫數(shù)據(jù)(復(fù)制)
//2.1定義數(shù)組用于臨時(shí)存儲(chǔ)讀取到數(shù)據(jù)
byte[] data=new byte[1024];//這里數(shù)組的大小是自定義
//2.2循環(huán)讀取數(shù)據(jù)
int length=-1;
while((length=fis.read(data))!=-1){//這里數(shù)組大小是1024,所以最多一次讀取1024個(gè)字節(jié),length表示讀取的字節(jié)數(shù)
fos.write(data,0,length);//讀了多少寫多少,0表示起始位置,length表示寫入的字節(jié)數(shù)
}
//3.關(guān)閉流對(duì)象
fis.close();
fos.close();
}
}文本數(shù)據(jù)操作
對(duì)于FileInputStream和FileOutputStream提供的方法只能讀寫字節(jié)數(shù)據(jù),對(duì)于文本數(shù)據(jù)如何操作呢?
案例1:寫文本數(shù)據(jù)
package io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* 文本數(shù)據(jù)的寫操作實(shí)現(xiàn)
*/
public class WriteStringDemo01 {
public static void main(String[] args) throws IOException {
String str = "我愛Java";
//構(gòu)建文件輸出流對(duì)象
FileOutputStream fos=new FileOutputStream("./f1.txt");
//寫字符數(shù)據(jù)
byte[] data=str.getBytes(StandardCharsets.UTF_8);
fos.write(data);
str="Hello Tedu";
fos.write(str.getBytes(StandardCharsets.UTF_8));
//釋放資源
fos.close();
}
}案例2:讀文本數(shù)據(jù)
package io;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ReadStringDemo01 {
public static void main(String[] args) throws IOException {
//1.構(gòu)建文件輸入流對(duì)象
//方式1:
// File file=new File("./f1.txt");
// long size=file.length();
// FileInputStream fis=new FileInputStream(file);
//方式2:
FileInputStream fis=new FileInputStream("./f1.txt");
//2.讀取文件內(nèi)容(將數(shù)據(jù)讀取到字節(jié)數(shù)組中)
//byte[] data=new byte[(int)size];
byte[] data=new byte[fis.available()];//fis.available()獲取流中有效字節(jié)數(shù)
int len=fis.read(data);
//3.將字節(jié)數(shù)組內(nèi)容轉(zhuǎn)換為字符串并輸出
String str=new String(data,0,len);
System.out.println(str);
//4.關(guān)閉流
fis.close();
}
}字節(jié)緩沖流應(yīng)用
處理流
概述
處理流是Java IO流體系中的一類重要的流,它們是在已經(jīng)存在的流(稱為基礎(chǔ)流或節(jié)點(diǎn)流)之上構(gòu)建的,為這些流添加額外的功能,而不改變?cè)鞅旧?。處理流的主要目的是為了增?qiáng)或改變流的行為,比如提供緩沖、轉(zhuǎn)換數(shù)據(jù)類型、序列化等等。
應(yīng)用特征
處理流的典型特征是它們自身并不直接連接到物理的輸入/輸出設(shè)備,而是“裝飾”在其他流之上,利用這些流進(jìn)行數(shù)據(jù)的讀寫,并在此基礎(chǔ)上提供附加服務(wù)。處理流的實(shí)例通常會(huì)把讀寫操作委托給底層的流,同時(shí)可能對(duì)數(shù)據(jù)進(jìn)行一些預(yù)處理或后處理。
處理流可以串聯(lián)使用,即一個(gè)處理流的輸出可以作為另一個(gè)處理流的輸入,形成流的鏈?zhǔn)浇Y(jié)構(gòu)。例如,可以先使用BufferedInputStream對(duì)FileInputStream進(jìn)行包裝,然后再用其它處理流包裝這個(gè)緩沖流。
字節(jié)緩沖流
Java中的緩沖流是一種處理流,有java.io.BufferedInputStream和BufferedOutputStream其作用就是加快讀寫效率,通常緩沖流的應(yīng)用最終要鏈接在低級(jí)流上。
- 緩沖字節(jié)輸出流
BufferedOutputStream(OutputStream out)
實(shí)例化一個(gè)緩沖字節(jié)輸出流并鏈接在指定的字節(jié)輸出流上。默認(rèn)緩沖區(qū)大小8kb(內(nèi)部維護(hù)的byte[] buf數(shù)組長(zhǎng)度8192)
BufferedOutputStream(OutputStream out,int size)
實(shí)例化一個(gè)指定緩沖區(qū)大小的緩沖字節(jié)輸出流并鏈接在指定的字節(jié)輸出流上。 - 緩沖字節(jié)輸入流
BufferedInputStream(InputStream in)
實(shí)例化一個(gè)緩沖字節(jié)輸入流并鏈接在指定的字節(jié)輸入流上。默認(rèn)緩沖區(qū)大小8kb(內(nèi)部維護(hù)的byte[] buf數(shù)組長(zhǎng)度8192)
BufferedInputStream(InputStream in,int size)
實(shí)例化一個(gè)指定緩沖區(qū)大小的緩沖字節(jié)輸入流并鏈接在指定的字節(jié)輸入流上。
應(yīng)用案例分析
package io;
import java.io.*;
/**
* 基于緩沖流實(shí)現(xiàn)文件復(fù)制
*/
public class FileCopyDemo03 {
public static void main(String[] args) throws IOException {
//1.構(gòu)建輸入輸出流對(duì)象(緩沖流增強(qiáng)文件流)
BufferedInputStream bis =
new BufferedInputStream(//處理流(這個(gè)流對(duì)象內(nèi)置一個(gè)緩沖區(qū)-byte[])
new FileInputStream("./a.png"));//節(jié)點(diǎn)流
BufferedOutputStream bos =
new BufferedOutputStream(//處理流
new FileOutputStream("./c.png"));//節(jié)點(diǎn)流
//2.讀寫數(shù)據(jù)(拷貝)
byte[] data=new byte[16];
int len;
while ((len = bis.read(data)) != -1){
bos.write(data,0,len);
}
bos.flush();//這里表示刷新緩沖區(qū)內(nèi)容到文件
//3.關(guān)閉流對(duì)象(關(guān)閉外層流時(shí),內(nèi)層流會(huì)自動(dòng)關(guān)閉)
bis.close();
bos.close();
}
}對(duì)象流應(yīng)用實(shí)踐
簡(jiǎn)介
Java中的對(duì)象流也是一種處理流,有java.io.ObjectInputStream和java.io.ObjectOutputStream兩個(gè)類型,用于實(shí)現(xiàn)對(duì)象的讀寫。也就是對(duì)象的序列化(把對(duì)象轉(zhuǎn)化為字節(jié))和反序列化(把字節(jié)轉(zhuǎn)換為對(duì)象)。
- ObjectOutputStream:用于將Java對(duì)象序列化為字節(jié)流,以便可以將對(duì)象寫入文件、網(wǎng)絡(luò)或其他任何形式的持久存儲(chǔ)中。
- ObjectInputStream:用于從字節(jié)流中反序列化Java對(duì)象,即將字節(jié)流重新轉(zhuǎn)換為Java對(duì)象。
Serializable接口
為了能夠被序列化,一個(gè)對(duì)象所屬的類必須實(shí)現(xiàn)Serializable接口。Serializable是一個(gè)標(biāo)記接口,不包含任何方法,它的存在僅僅是為了標(biāo)識(shí)一個(gè)類是可序列化的。如果嘗試序列化一個(gè)沒有實(shí)現(xiàn)Serializable接口的類的對(duì)象,將會(huì)拋出NotSerializableException異常。
應(yīng)用案例分析
設(shè)計(jì)一個(gè)Message對(duì)象類型
package io;
import java.io.Serializable;
/**
* 消息對(duì)象
*/
public class Message implements Serializable {
//Serializable只起到一個(gè)標(biāo)識(shí)性作用
//添加序列化id(序列化時(shí)類中沒有寫序列化id,系統(tǒng)也會(huì)基于類中的屬性和方法自動(dòng)生成)
//private static final long serialVersionUID=1L;
//Idea自動(dòng)生成序列化ID如何進(jìn)行配置?可以在大模型中去搜索
private static final long serialVersionUID = 8725255648785219540L;
/*消息id*/
private Integer id;
/**消息標(biāo)題,
* 假如這個(gè)屬性不希望系列化,
* 可以使用transient關(guān)鍵字修飾*/
private transient String title;
/**消息內(nèi)容*/
private String content;
//private Integer userId;
//.....
public Message() {}
public Message(Integer id, String title, String content) {
this.id=id;
this.title=title;
this.content=content;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
//alt+insert
@Override
public String toString() {
return "Message{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}對(duì)象序列化案例實(shí)現(xiàn)
package io;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
* 對(duì)象流應(yīng)用
*/
public class ObjectOutputStreamDemo01 {
public static void main(String[] args) throws IOException {
Message m1 = new Message(1, "傳奇老師病了", "做了個(gè)小手術(shù)");
//1.構(gòu)建流對(duì)象
ObjectOutputStream oos =
new ObjectOutputStream(
new FileOutputStream("message.txt"));
//2.寫對(duì)象(序列化)
oos.writeObject(m1);
System.out.println("序列化OK");
//3.關(guān)閉流對(duì)象
oos.close();
}
}對(duì)象反序列化案例實(shí)現(xiàn)
package io;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
/**
* 將message.txt文件中的內(nèi)容進(jìn)行反序列化
*/
public class ObjectInputStreamDemo02 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.創(chuàng)建流對(duì)象
ObjectInputStream ois=
new ObjectInputStream(
newFileInputStream("message.txt"));
//2.讀取對(duì)象(反序列化-先讀出來的是字節(jié),然后將字節(jié)轉(zhuǎn)換對(duì)象)
Message msg=(Message)ois.readObject();
System.out.println(msg);
//3.關(guān)閉資源
ois.close();
}
}字符轉(zhuǎn)換流應(yīng)用
字符流
在Java中,字符流(Character Streams)是用于處理文本數(shù)據(jù)的一種流類型,其基類是java.io.Reader和java.io.Writer兩個(gè)抽象類。
應(yīng)用場(chǎng)景?
字符流廣泛應(yīng)用于讀寫文本文件,處理字符串,以及在網(wǎng)絡(luò)通信中傳輸文本數(shù)據(jù)。由于文本文件通常包含人類可讀的內(nèi)容,字符流可以確保正確處理各種字符集和編碼,從而避免亂碼問題。
為什么使用字符流?
- 編碼透明性:字符流允許你指定字符編碼,因此你可以讀寫使用不同編碼的文本文件,而不需要了解具體的編碼細(xì)節(jié)。
- 字符邊界處理:當(dāng)處理多字節(jié)編碼(如UTF-8)的字符時(shí),字符流能確保每次讀寫的都是一個(gè)完整的字符,避免字節(jié)流中可能出現(xiàn)的字符截?cái)鄦栴}(這里其實(shí)是亂碼)
字符流超類
- java.io.Writer 所有字符輸入流的超類
常用方法
void write(int c):寫出一個(gè)字符,寫出給定int值”低16”位表示的字符。
void write(char[] chs):將給定字符數(shù)組中所有字符寫出。
void write(String str):將給定的字符串寫出
void write(char[] chs,int offset,int len):將給定的字符數(shù)組中從offset處開始連續(xù)的len個(gè)字符寫出
- java.io.Reader 所有字符輸出流的超類
常用方法
int read():讀取一個(gè)字符,返回的int值“低16”位有效。當(dāng)返回值為-1時(shí)表達(dá)流讀取到了末尾。
int read(char[] chs):從該流中讀取一個(gè)字符數(shù)組的length個(gè)字符并存入該數(shù)組,返回值為實(shí)際讀取到的字符量。當(dāng)返回值為-1時(shí)表達(dá)流讀取到了
字符轉(zhuǎn)換流應(yīng)用
在Java中,字符轉(zhuǎn)換流是Java I/O體系中的一類流,它們實(shí)現(xiàn)了字節(jié)流和字符流之間的轉(zhuǎn)換。這類流包括InputStreamReader和OutputStreamWriter兩個(gè)核心類。*
InputStreamReader是一個(gè)讀取字節(jié)并使用指定的字符集將其解碼為字符的Reader;OutputStreamWriter則是一個(gè)接收字符并使用指定的字符集將其編碼為字節(jié)的Writer。
應(yīng)用場(chǎng)景
- 當(dāng)你需要從字節(jié)流中讀取文本數(shù)據(jù),并且想要控制使用的字符編碼時(shí)。
- 當(dāng)你需要將字符數(shù)據(jù)寫入到字節(jié)流中,并指定字符編碼時(shí)。
- 在網(wǎng)絡(luò)通信中,當(dāng)你發(fā)送或接收的數(shù)據(jù)是以字節(jié)形式存在,但你希望以字符形式處理時(shí)。
為什么用它?
- 編碼兼容性:不同的系統(tǒng)和文件可能使用不同的字符編碼,字符轉(zhuǎn)換流可以讓你指定編碼,從而正確解析或生成文本。
- 國(guó)際化支持:為了支持多種語(yǔ)言和字符集,字符轉(zhuǎn)換流提供了靈活的編碼選擇,這對(duì)于開發(fā)國(guó)際化應(yīng)用非常重要。
- 數(shù)據(jù)完整性:在處理多字節(jié)編碼的字符時(shí),字節(jié)流可能會(huì)導(dǎo)致字符被錯(cuò)誤地分割,而字符轉(zhuǎn)換流保證了字符的完整性和正確性。
應(yīng)用案例分析和實(shí)踐
- OutputStreamWriter 應(yīng)用案例(字符輸出轉(zhuǎn)化流應(yīng)用)
兩個(gè)構(gòu)造方法:
OutputStreamWriter(OutputStream out,Charset cs)
基于給定的字節(jié)輸出流以及字符編碼創(chuàng)建OSW
OutputStreamWriter(OutputStream out)
該構(gòu)造方法會(huì)根據(jù)系統(tǒng)默認(rèn)字符集創(chuàng)建OSW
具體應(yīng)用:通過字符轉(zhuǎn)換流將一些字符串寫入到指定文件
package io;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
/**
* 通過字符轉(zhuǎn)換流將一些字符串寫入到指定文件
*/
public class OutputStreamWriterDemo01 {
public static void main(String[] args) throws IOException {
//1.構(gòu)建字符轉(zhuǎn)換輸出流對(duì)象
OutputStreamWriter osw =
new OutputStreamWriter(
new FileOutputStream("./osw.txt"),
StandardCharsets.UTF_8);
//2.寫數(shù)據(jù)(字符串)
osw.write("你好");//這里不會(huì)自動(dòng)換行
osw.write("子千老師");
System.out.println("數(shù)據(jù)寫出完畢");
//3.關(guān)閉流對(duì)象
osw.close();
}
}- IntputStreamReader 應(yīng)用案例(字符輸入轉(zhuǎn)化流應(yīng)用)
構(gòu)造方法:
InputStreamWriter(InputStream in,Charset cs)
基于給定的字節(jié)輸入流以及字符編碼創(chuàng)建當(dāng)前轉(zhuǎn)換流
InputStreamWriter(InputStream in)
該構(gòu)造方法會(huì)根據(jù)系統(tǒng)默認(rèn)字符集創(chuàng)建當(dāng)前轉(zhuǎn)換流
具體應(yīng)用案例:基于字符轉(zhuǎn)換流從文件讀取字符數(shù)據(jù)
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
/**
* 基于字符轉(zhuǎn)換流從文件讀取字符數(shù)據(jù)
*/
public class InputStreamReaderDemo01 {
public static void main(String[] args) throws IOException {
//1.創(chuàng)建字符輸入轉(zhuǎn)換流對(duì)象
InputStreamReader isr = new InputStreamReader(
new FileInputStream("./osw.txt"),
StandardCharsets.UTF_8);
//2.讀數(shù)據(jù)
int data=0;
while((data=isr.read())!=-1){
System.out.print((char)data);
}
//3.關(guān)閉流對(duì)象
isr.close();
}
}字符緩沖流應(yīng)用
簡(jiǎn)介
在Java中,字符緩沖流是用于提高讀寫性能的一對(duì)流,它們包括BufferedReader和BufferedWriter。這些流通過內(nèi)部緩存機(jī)制減少了對(duì)底層I/O設(shè)備的訪問頻率,從而提高了讀寫操作的效率。
在字符輸出緩沖流應(yīng)用時(shí),通常會(huì)結(jié)合PrintWriter一起使用。這個(gè)對(duì)象可以一次寫一行,并且可以自帶刷新機(jī)制。
快速入門實(shí)現(xiàn)
案例1:PrintWriter 不同構(gòu)造方法應(yīng)用
package io;
import java.io.*;
/**
* 打印流應(yīng)用
*/
public class PrintWriterDemo01 {
public static void main(String[] args) throws FileNotFoundException {
//1.構(gòu)建PrintWriter對(duì)象
//方式1:需要手動(dòng)刷新緩沖區(qū)或者關(guān)閉流
PrintWriter pw=new PrintWriter("./pw.txt");
//方式2:自動(dòng)刷新,構(gòu)造方法中的true表示自動(dòng)刷新
//PrintWriter pw = new PrintWriter(
//new FileOutputStream("./pw.txt"),true);
//2.寫入數(shù)據(jù)
pw.println("hello");
pw.println("world");
pw.println("Java");
//3.關(guān)閉流對(duì)象
pw.close();
}
}案例2:自己指定緩沖流
package io;
import java.io.*;
public class PrintWriterDemo02 {
public static void main(String[] args) throws FileNotFoundException {
//1.構(gòu)建打印流對(duì)象(裝飾模式)
PrintWriter printWriter = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("./pw.txt",true))), true);
//2.寫數(shù)據(jù)
printWriter.println("hello");
printWriter.println("Java");
//3.關(guān)閉流對(duì)象
printWriter.close();
}
}案例3:字符輸入緩沖流應(yīng)用
package io;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* 編寫一個(gè)程序,能從一個(gè)文件中讀取數(shù)據(jù),一次讀取一行,并將讀取的內(nèi)容進(jìn)行輸出
*/
public class BufferedReaderDemo01 {
public static void main(String[] args) throws IOException {
//1.構(gòu)建BufferedReader對(duì)象
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("./src/main/java/io/FISDemo01.java"),
StandardCharsets.UTF_8));
//2.循環(huán)讀取文件中數(shù)據(jù),讀一行,輸出一行
String line = null;
while ((line = br.readLine()) != null) {//readLine用于讀取一行
System.out.println(line);
}
//3.關(guān)閉流對(duì)象
br.close();
}
}到此這篇關(guān)于Java中最全最基礎(chǔ)的IO流概述和簡(jiǎn)介案例分析的文章就介紹到這了,更多相關(guān)java io流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)將Boolean轉(zhuǎn)為Json對(duì)象的方法
在Java中,將boolean值轉(zhuǎn)換為JSON對(duì)象通常涉及使用JSON庫(kù),例如org.json或Gson,這里我們將使用org.json庫(kù)來進(jìn)行詳細(xì)演示,這個(gè)庫(kù)提供了簡(jiǎn)單且直觀的方法來創(chuàng)建和操作JSON對(duì)象,需要的朋友可以參考下2024-11-11
maven打生產(chǎn)環(huán)境可執(zhí)行包的實(shí)現(xiàn)
本文主要介紹了maven打生產(chǎn)環(huán)境可執(zhí)行包的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
java.lang.ExceptionInInitializerError異常的解決方法
這篇文章主要為大家詳細(xì)介紹了java.lang.ExceptionInInitializerError異常的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
maven倉(cāng)庫(kù)repositories和mirrors的配置及區(qū)別詳解
這篇文章主要介紹了maven倉(cāng)庫(kù)repositories和mirrors的配置及區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Springcloud整合stream,rabbitmq實(shí)現(xiàn)消息驅(qū)動(dòng)功能
官方定義SpringCloud?Stream?是一個(gè)構(gòu)建消息驅(qū)動(dòng)微服務(wù)的框架。我們只需要搞清楚如何與Spring?Cloud?Stream?交互就可以方便使用消息驅(qū)動(dòng)的方式。本文將通過Springcloud整合stream,rabbitmq實(shí)現(xiàn)消息驅(qū)動(dòng)功能,需要的可以參考一下2022-02-02
詳解spring security四種實(shí)現(xiàn)方式
這篇文章主要介紹了詳解spring security四種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java 中利用泛型和反射機(jī)制抽象DAO的實(shí)例
這篇文章主要介紹了Java 中利用泛型和反射機(jī)制抽象DAO的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07

