Java中的字節(jié)流InputStream和OutputStream詳解
1. InputStream(字節(jié)輸入流)
- 我們看到的具體的某一些管道,凡是以InputStream結(jié)尾的管道,都是以字節(jié)的形式向我們的程序輸入數(shù)據(jù)。
- 繼承自InputStream的流都是用于向程序中輸入數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)(Byte)=> (8bit);下圖中深色為節(jié)點(diǎn)流,淺色為處理流。

InputStream的基本方法
//讀取一個字節(jié)并以整數(shù)的形式返回(0~255)
// 如果返回-1就說明已經(jīng)到了輸入流的末尾
int read () throws IOException
//讀取一系列字節(jié)并存儲到一個數(shù)組buffer
// 返回實(shí)際讀取的字節(jié)數(shù),如果讀取前已到輸入流的末尾,則返回-1
int read ( byte[] buffer) throws IOException
//從offset位置開始,讀取length個字節(jié),并存儲到一個字節(jié)數(shù)組buffer,
// 返回實(shí)際讀取的字節(jié)數(shù),如果讀取前以到輸入流的末尾返回-1.
int read ( byte[] buffer, int offset, int length) throws IOException
//關(guān)閉流釋放內(nèi)存資源
void close () throws IOException
//跳過n個字節(jié)不讀,返回實(shí)際跳過的字節(jié)數(shù)
long skip(long n) throws IOException
read()方法是一個字節(jié)一個字節(jié)地往外讀,每讀取一個字節(jié),就處理一個字節(jié)。read(byte[] buffer)方法讀取數(shù)據(jù)時,先把讀取到的數(shù)據(jù)填滿這個byte[]類型的數(shù)組buffer(buffer是內(nèi)存里面的一塊緩沖區(qū)),然后再處理數(shù)組里面的數(shù)據(jù)。這就跟我們?nèi)∷粯?,先用一個桶去接,等桶接滿水后再處理桶里面的水。如果是每讀取一個字節(jié)就處理一個字節(jié),這樣子讀取也太累了。
【演示:使用FileInputStream流來讀取FileInputStream.java文件的內(nèi)容】
read.txt


Test.java
package character1;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
// 使用變量b來裝調(diào)用read()方法時返回的整數(shù)
int b = 0;
/*
使用FileInputStream流來讀取有中文的內(nèi)容時,讀出來的是亂碼,
因?yàn)槭褂?InputStream流里面的read()方法讀取內(nèi)容時是一個字節(jié)一個字節(jié)地讀取的,
而一個漢字是占用兩個 字節(jié)的,所以讀取出來的漢字無法正確顯示。
使用FileReader流來讀取內(nèi)容時,中英文都可以正確顯示,
因?yàn)镽eader流里面的 read()方法是一個字符一個字符地讀取的,
這樣每次讀取出來的都是一個完整的漢字,這樣就可以正確 顯示了。
*/
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\read.txt");
} catch (FileNotFoundException e) {
System.out.println("系統(tǒng)找不到指定的文件");
System.exit(-1);// 系統(tǒng)非正常退出
}
long num = 0; // 使用變量num來記錄讀取到的字符數(shù)
// 調(diào)用read()方法時會拋異常,所以需要捕獲異常
try {
/*
調(diào)用int read() throws Exception方法時,返回的是一個int類型的整數(shù)
循環(huán)結(jié)束的條件就是返回一個值-1,表示此時已經(jīng)讀取到文件的末尾了。
*/
while ((b = inputStream.read()) != -1) {
// “char(b)”把使用數(shù)字(ASCII碼)英文字母轉(zhuǎn)換成字符輸入
System.out.print((char) b);
num++;
}
inputStream.close();// 關(guān)閉輸入流
System.out.println("總共讀取了" + num + "個字節(jié)的文件");
} catch (IOException e) {
System.out.println("文件讀取錯誤");
System.exit(-1);// 系統(tǒng)非正常退出
}
}
}

2. OutputStream(輸出流)
繼承自O(shè)utputStream的流是用于程序中輸出數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)(Byte)=> (8bit);下圖中深色的為節(jié)點(diǎn)流,淺色為處理流。

OutputStream的基本方法:

案例: 【使用FileOutputStream流往一個文件里面寫入數(shù)據(jù)】

Test.java
package character1;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
// 使用變量b來裝調(diào)用read()方法時返回的整數(shù)
int b = 0;
try (FileInputStream inputStream = new FileInputStream("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\read.txt");
FileOutputStream outputStream = new FileOutputStream("\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\write.txt")) {
while ((b = inputStream.read()) != -1) {
outputStream.write(b);
}
} catch (IOException e) {
System.out.println("讀取文件異常");
System.exit(-1);// 系統(tǒng)非正常退出
}
System.out.println("文件寫入成功");
}
}

write.txt

3. 小結(jié)
FileInputStream和FileOutputStream這兩個流都是字節(jié)流,都是以一個字節(jié)為單位進(jìn)行輸入和輸出的。
所以對于占用2個字節(jié)存儲空間的字符來說讀取出來時就會顯示成亂碼。
到此這篇關(guān)于Java中的字節(jié)流InputStream和OutputStream詳解的文章就介紹到這了,更多相關(guān)Java的InputStream和OutputStream內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA同步代碼時版本沖突而產(chǎn)生出的incoming partial文件問題的解決辦法
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA同步代碼時版本沖突而產(chǎn)生出的incoming partial文件問題的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
通過Java創(chuàng)建Socket連接到服務(wù)器方式
這篇文章主要介紹了通過Java創(chuàng)建Socket連接到服務(wù)器方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
使用注解@Validated效驗(yàn)VO參數(shù)是否合規(guī)
這篇文章主要為大家介紹了使用注解@Validated效驗(yàn)VO參數(shù)是否合規(guī)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Springboot jar運(yùn)行時如何將jar內(nèi)的文件拷貝到文件系統(tǒng)中
因?yàn)閳?zhí)行需要,需要把jar內(nèi)templates文件夾下的的文件夾及文件加壓到宿主機(jī)器的某個路徑下,以便執(zhí)行對應(yīng)的腳本文件,這篇文章主要介紹了Springboot jar運(yùn)行時如何將jar內(nèi)的文件拷貝到文件系統(tǒng)中,需要的朋友可以參考下2024-06-06

