Java中的字節(jié)流InputStream和OutputStream詳解
1. InputStream(字節(jié)輸入流)
- 我們看到的具體的某一些管道,凡是以InputStream結(jié)尾的管道,都是以字節(jié)的形式向我們的程序輸入數(shù)據(jù)。
- 繼承自InputStream的流都是用于向程序中輸入數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)(Byte)=> (8bit);下圖中深色為節(jié)點(diǎn)流,淺色為處理流。
InputStream的基本方法
//讀取一個(gè)字節(jié)并以整數(shù)的形式返回(0~255) // 如果返回-1就說(shuō)明已經(jīng)到了輸入流的末尾 int read () throws IOException //讀取一系列字節(jié)并存儲(chǔ)到一個(gè)數(shù)組buffer // 返回實(shí)際讀取的字節(jié)數(shù),如果讀取前已到輸入流的末尾,則返回-1 int read ( byte[] buffer) throws IOException //從offset位置開(kāi)始,讀取length個(gè)字節(jié),并存儲(chǔ)到一個(gè)字節(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 //跳過(guò)n個(gè)字節(jié)不讀,返回實(shí)際跳過(guò)的字節(jié)數(shù) long skip(long n) throws IOException
read()方法是一個(gè)字節(jié)一個(gè)字節(jié)地往外讀,每讀取一個(gè)字節(jié),就處理一個(gè)字節(jié)。read(byte[] buffer)方法讀取數(shù)據(jù)時(shí),先把讀取到的數(shù)據(jù)填滿這個(gè)byte[]類型的數(shù)組buffer(buffer是內(nèi)存里面的一塊緩沖區(qū)),然后再處理數(shù)組里面的數(shù)據(jù)。這就跟我們?nèi)∷粯?,先用一個(gè)桶去接,等桶接滿水后再處理桶里面的水。如果是每讀取一個(gè)字節(jié)就處理一個(gè)字節(jié),這樣子讀取也太累了。
【演示:使用FileInputStream流來(lái)讀取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來(lái)裝調(diào)用read()方法時(shí)返回的整數(shù) int b = 0; /* 使用FileInputStream流來(lái)讀取有中文的內(nèi)容時(shí),讀出來(lái)的是亂碼, 因?yàn)槭褂?InputStream流里面的read()方法讀取內(nèi)容時(shí)是一個(gè)字節(jié)一個(gè)字節(jié)地讀取的, 而一個(gè)漢字是占用兩個(gè) 字節(jié)的,所以讀取出來(lái)的漢字無(wú)法正確顯示。 使用FileReader流來(lái)讀取內(nèi)容時(shí),中英文都可以正確顯示, 因?yàn)镽eader流里面的 read()方法是一個(gè)字符一個(gè)字符地讀取的, 這樣每次讀取出來(lái)的都是一個(gè)完整的漢字,這樣就可以正確 顯示了。 */ 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來(lái)記錄讀取到的字符數(shù) // 調(diào)用read()方法時(shí)會(huì)拋異常,所以需要捕獲異常 try { /* 調(diào)用int read() throws Exception方法時(shí),返回的是一個(gè)int類型的整數(shù) 循環(huán)結(jié)束的條件就是返回一個(gè)值-1,表示此時(shí)已經(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 + "個(gè)字節(jié)的文件"); } catch (IOException e) { System.out.println("文件讀取錯(cuò)誤"); System.exit(-1);// 系統(tǒng)非正常退出 } } }
2. OutputStream(輸出流)
繼承自O(shè)utputStream的流是用于程序中輸出數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)(Byte)=> (8bit);下圖中深色的為節(jié)點(diǎn)流,淺色為處理流。
OutputStream的基本方法:
案例: 【使用FileOutputStream流往一個(gè)文件里面寫入數(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來(lái)裝調(diào)用read()方法時(shí)返回的整數(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這兩個(gè)流都是字節(jié)流,都是以一個(gè)字節(jié)為單位進(jìn)行輸入和輸出的。
所以對(duì)于占用2個(gè)字節(jié)存儲(chǔ)空間的字符來(lái)說(shuō)讀取出來(lái)時(shí)就會(huì)顯示成亂碼。
到此這篇關(guān)于Java中的字節(jié)流InputStream和OutputStream詳解的文章就介紹到這了,更多相關(guān)Java的InputStream和OutputStream內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea如何解決commit代碼時(shí)一直code Analyze加載的問(wèn)題
文章介紹了解決Git提交代碼時(shí)出現(xiàn)codeAnalyze加載卡頓問(wèn)題的方法,即關(guān)閉IDEA中的相關(guān)設(shè)置選項(xiàng),作者分享個(gè)人經(jīng)驗(yàn),希望對(duì)大家有所幫助,并鼓勵(lì)支持腳本之家2025-01-01如何解決通過(guò)spring-boot-maven-plugin package失敗問(wèn)題
這篇文章主要介紹了如何解決通過(guò)spring-boot-maven-plugin package失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04redis與ssm整合方法(mybatis二級(jí)緩存)
本文給大家介紹redis與ssm整合方法(mybatis二級(jí)緩存)。主要是利用redis去做mybatis的二級(jí)緩存,mybaits映射文件中所有的select都會(huì)刷新已有緩存,如果不存在就會(huì)新建緩存,所有的insert,update操作都會(huì)更新緩存2017-12-12利用Java實(shí)現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片)的詳細(xì)代碼
這篇文章主要為大家詳細(xì)介紹了利用Java實(shí)現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片),文中的示例代碼講解詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02對(duì)Java的面對(duì)對(duì)象編程中對(duì)象和引用以及內(nèi)部類的理解
這篇文章主要介紹了對(duì)Java的面對(duì)對(duì)象編程中對(duì)象和引用以及內(nèi)部類的理解,需要的朋友可以參考下2016-01-01Java超過(guò)long類型的數(shù)據(jù)表示方法
這篇文章主要給大家介紹Java超過(guò)long類型的數(shù)據(jù)如何表示,在 Java 中,如果需要表示超過(guò) long 類型范圍的數(shù)據(jù),可以使用 BigInteger 類,BigInteger 是 Java 提供的一個(gè)用于處理任意精度整數(shù)的類,它可以表示非常大或非常小的整數(shù),需要的朋友可以參考下2023-09-09