Java中的字節(jié)流InputStream和OutputStream詳解
1. InputStream(字節(jié)輸入流)
- 我們看到的具體的某一些管道,凡是以InputStream結(jié)尾的管道,都是以字節(jié)的形式向我們的程序輸入數(shù)據(jù)。
- 繼承自InputStream的流都是用于向程序中輸入數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)(Byte)=> (8bit);下圖中深色為節(jié)點流,淺色為處理流。
InputStream的基本方法
//讀取一個字節(jié)并以整數(shù)的形式返回(0~255) // 如果返回-1就說明已經(jīng)到了輸入流的末尾 int read () throws IOException //讀取一系列字節(jié)并存儲到一個數(shù)組buffer // 返回實際讀取的字節(jié)數(shù),如果讀取前已到輸入流的末尾,則返回-1 int read ( byte[] buffer) throws IOException //從offset位置開始,讀取length個字節(jié),并存儲到一個字節(jié)數(shù)組buffer, // 返回實際讀取的字節(jié)數(shù),如果讀取前以到輸入流的末尾返回-1. int read ( byte[] buffer, int offset, int length) throws IOException //關(guān)閉流釋放內(nèi)存資源 void close () throws IOException //跳過n個字節(jié)不讀,返回實際跳過的字節(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)容時,讀出來的是亂碼, 因為使用 InputStream流里面的read()方法讀取內(nèi)容時是一個字節(jié)一個字節(jié)地讀取的, 而一個漢字是占用兩個 字節(jié)的,所以讀取出來的漢字無法正確顯示。 使用FileReader流來讀取內(nèi)容時,中英文都可以正確顯示, 因為Reader流里面的 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é)點流,淺色為處理流。
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é)為單位進行輸入和輸出的。
所以對于占用2個字節(jié)存儲空間的字符來說讀取出來時就會顯示成亂碼。
到此這篇關(guān)于Java中的字節(jié)流InputStream和OutputStream詳解的文章就介紹到這了,更多相關(guān)Java的InputStream和OutputStream內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea如何解決commit代碼時一直code Analyze加載的問題
文章介紹了解決Git提交代碼時出現(xiàn)codeAnalyze加載卡頓問題的方法,即關(guān)閉IDEA中的相關(guān)設(shè)置選項,作者分享個人經(jīng)驗,希望對大家有所幫助,并鼓勵支持腳本之家2025-01-01如何解決通過spring-boot-maven-plugin package失敗問題
這篇文章主要介紹了如何解決通過spring-boot-maven-plugin package失敗問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04利用Java實現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片)的詳細代碼
這篇文章主要為大家詳細介紹了利用Java實現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片),文中的示例代碼講解詳細,對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02對Java的面對對象編程中對象和引用以及內(nèi)部類的理解
這篇文章主要介紹了對Java的面對對象編程中對象和引用以及內(nèi)部類的理解,需要的朋友可以參考下2016-01-01