Java超詳細(xì)梳理IO流的使用方法上
你要學(xué)會(huì):
- 流的概念
- 處理字節(jié)流的類
- 處理字符流的類
- Java標(biāo)準(zhǔn)輸入輸出
- 文件管理類
Java語言的輸入輸出類庫
1.流的概念
流是指計(jì)算機(jī)各部件之間的數(shù)據(jù)流動(dòng)??梢允窃嫉亩M(jìn)制數(shù)據(jù),也可以是編碼后的特定數(shù)據(jù)。
2.流的分類
按照數(shù)據(jù)的傳輸方法,流分為輸出流和輸入流。按照內(nèi)容區(qū)分為字節(jié)流和字符流。
3.流的作用
用戶可以通過流來讀寫數(shù)據(jù)。
輸入輸出流
Java中把不同的輸入輸出源(文件,屏幕,鍵盤等)抽象為流,輸入輸出的數(shù)據(jù)稱為數(shù)據(jù)流,數(shù)據(jù)流是Java程序接收和發(fā)送數(shù)據(jù)的一個(gè)通道。把數(shù)據(jù)從鍵盤等外設(shè)傳遞到程序稱為輸入流,輸入流只能從其讀取數(shù)據(jù)而不能向其寫入數(shù)據(jù),輸出流類似。
數(shù)據(jù)的接收和發(fā)送都是沿著數(shù)據(jù)序列順序進(jìn)行的,每一個(gè)數(shù)據(jù)都要等待前面的數(shù)據(jù)讀入或者送出才能進(jìn)行讀寫。
緩沖流
數(shù)據(jù)流中的每次操作都是以字節(jié)為單位的,為了提高數(shù)據(jù)傳輸效率,通常使用緩沖流。緩沖流就是為一個(gè)已有的流配上一個(gè)緩沖區(qū)。例如寫入數(shù)據(jù)時(shí),數(shù)據(jù)會(huì)先發(fā)送到緩沖區(qū),當(dāng)緩沖區(qū)滿時(shí),在發(fā)送到外部設(shè)備。
4.輸入輸出流類庫
- Java語言的輸入輸出流都封裝在java.io包中,使用前要先導(dǎo)包。用戶可以選擇包里的不同的流類實(shí)現(xiàn)各種數(shù)據(jù)的輸入輸出。其中字節(jié)流每次讀取8位二進(jìn)制數(shù),不能分解,重組和理解這些數(shù)據(jù),所以可以恢復(fù)到原來有意義的狀態(tài)。
- 字符流每次讀取16位二進(jìn)制數(shù),將其作為一個(gè)字符處理。字符流的源或目標(biāo)通常是文本文件,Java語言使用的是Unicode編碼,字符流可以實(shí)現(xiàn)程序內(nèi)部格式與文本文件,顯示輸出等外部格式的轉(zhuǎn)換。
- 在java.io中有四個(gè)類:
- InputStream等四個(gè)類是抽象類,用于數(shù)據(jù)的輸入輸出。不能直接使用,因?yàn)椴荒鼙砻骶唧w對應(yīng)哪一種輸入輸出設(shè)備,更體現(xiàn)了輸入輸出操作獨(dú)立與相關(guān)設(shè)備。File是文件類,用于磁盤文件與文件夾的管理。RandomAccessFile是隨機(jī)訪問文件類,用于實(shí)現(xiàn)對磁盤文件的隨機(jī)讀寫操作。
- 字節(jié)流類通常被用來讀寫圖片視頻等二進(jìn)制數(shù)據(jù),但也可以用來處理文本文件,字符流類通常用來處理文本文件。由于字節(jié)流不能直接操作Unicode編碼,因此不提倡使用字節(jié)流讀取文本文件,因?yàn)楫?dāng)文件中有漢字時(shí)可能會(huì)出現(xiàn)亂碼。
使用InputStream和OutputStream流類
下面流類的構(gòu)造方法和常用方法參見Java api
1.基本輸入輸出流
1.InpitStream流類
- InputStream流類中包含了一套所有字節(jié)輸入都需要的方法,可以完成從輸入流讀入數(shù)據(jù)的操作。
- 當(dāng)程序從鍵盤磁盤文件等外設(shè)讀入數(shù)據(jù)時(shí),要先創(chuàng)建一個(gè)子類的對象來與外設(shè)連接,再調(diào)用該對象繼承的read()方法實(shí)現(xiàn)輸入操作。流中的方法都聲明拋出異常,所以程序中調(diào)用流方法時(shí)要處理異常,否則編譯不通過。
2.OutputStream流類
- OutputStream類中包含了一套所有字節(jié)輸出都需要的方法,可以完成從輸出流寫入數(shù)據(jù)的操作。
- 當(dāng)程序向屏幕磁盤文件等外設(shè)輸入數(shù)據(jù)時(shí),要先創(chuàng)建一個(gè)子類對象來與外設(shè)連接,再調(diào)用該對象繼承的write()方法實(shí)現(xiàn)輸出操作。
2.輸入輸出流的應(yīng)用
InputStream類和OutputStream類時(shí)抽象類,具體實(shí)現(xiàn)輸入輸出操作時(shí)要派生出不同的子類,用于不同情況數(shù)據(jù)的輸入輸出操作。一起來學(xué)習(xí)這些類趴:
2.1文件輸入輸出流
- FileInputStream和FileOutputStream流負(fù)責(zé)本地磁盤的文件的順序輸入輸出操作。
- FileInputStream類的對象表示文件字節(jié)輸入流,從中可以讀取數(shù)據(jù)。 在生成該類的對象時(shí)若找不到指定文件,則一定會(huì)拋出FileNotFoundException異常。該異常必須捕獲或者聲明拋出。
- FileOutputStream類的對象表示文件字節(jié)輸出流,可向流中寫入數(shù)據(jù)。在生成該類的對象時(shí)若找不到文件則創(chuàng)建一個(gè)新文件,若已存在,則清除原文件的內(nèi)容。在進(jìn)行文件讀寫操作時(shí)會(huì)產(chǎn)生IOException異常,該異常必須捕獲或聲明拋出。
- 其中File是java.io包中的類,每個(gè)File對象表示一個(gè)磁盤文件或者文件夾,其中屬性包含了文件夾的名稱長度等信息。
- 無論哪一個(gè)構(gòu)造方法,在創(chuàng)建文件輸入輸出流時(shí)都可能因?yàn)槲募粚Γ窂讲粚?,屬性不對等無法打開文件造成錯(cuò)誤,拋出FileNotFoundException異常,執(zhí)行writer()和reader()方法時(shí)因?yàn)镮O錯(cuò)誤拋出IOException異常。所以輸入輸出流并調(diào)用構(gòu)造方法以及執(zhí)行讀寫操作的語句應(yīng)放在try語句塊中,并由相應(yīng)的catch語句捕獲異常。
- FileDescriptor是該包中的另一個(gè)類,不能實(shí)例化。其中有三個(gè)靜態(tài)成員變量in,out,err。分別是標(biāo)準(zhǔn)輸入輸出流,標(biāo)準(zhǔn)錯(cuò)誤流,可以利用它們實(shí)現(xiàn)鍵盤輸入屏幕輸出。
2.2順序輸入流
順序輸入流SequenceInputStream是將多個(gè)輸入流順序連接在一起,形成單一的數(shù)據(jù)輸入流,沒有對應(yīng)的數(shù)據(jù)輸出流。在輸入數(shù)據(jù)時(shí),順序輸入流依次打開每個(gè)輸入流并讀取數(shù)據(jù)。直到最后一個(gè)輸入流讀取到EOF時(shí)為止。
2.3管道輸入輸出流
- 管道輸入輸出流為了實(shí)現(xiàn)程序內(nèi)部線程間的通信或者不同程序的通信,這兩個(gè)類要結(jié)合使用,輸入流作為接受端,輸出流做為發(fā)送端。
- 管道字節(jié)輸入流PipedInputStream類和管道字節(jié)輸出流PipedOutputStream類提供了管道的方式數(shù)據(jù)輸入輸出管理類。
2.4過濾輸入輸出流
- 過濾字節(jié)輸入輸出流時(shí)建立在基本輸入輸出流之上的,在輸入輸出數(shù)據(jù)時(shí)可以對數(shù)據(jù)做類型和格式的轉(zhuǎn)換,即可以對二進(jìn)制字節(jié)數(shù)據(jù)理解和編碼轉(zhuǎn)換。
- 過濾字節(jié)輸入流FilterInputStream和過濾字節(jié)輸出流FilterOutputStream可以在數(shù)據(jù)讀寫的同時(shí)實(shí)現(xiàn)數(shù)據(jù)操作。是上面兩個(gè)類的直接子類,也屬于抽象類,被DateInputStream和DateOutputStream繼承。
- 有時(shí)候我們并不希望數(shù)據(jù)的傳輸以字節(jié)為基本單位,如一個(gè)二進(jìn)制文件存放的是整型數(shù)據(jù),我們希望按照int為基本單位進(jìn)行數(shù)據(jù)傳輸。這兩個(gè)過濾流可以將基本數(shù)據(jù)輸入輸出流轉(zhuǎn)換為基本數(shù)據(jù)類型的過濾流。
2.5標(biāo)準(zhǔn)輸入輸出
- 前面說到的,在一般操作時(shí),要先創(chuàng)建一個(gè)輸入輸出的實(shí)例化對象,完成與外設(shè)的連接,但是在與標(biāo)準(zhǔn)的輸入輸出設(shè)備連接時(shí)不用這樣。
- Java系統(tǒng)實(shí)現(xiàn)在java.lang.System包中定義了靜態(tài)流對象,輸入流System.in,一般指鍵盤。輸出流System.out,一般指屏幕。標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備System.err使程序運(yùn)行錯(cuò)誤時(shí)有日志等固定輸出位置。
- (1)標(biāo)準(zhǔn)輸入,System.in是BufferedInputStream的對象,當(dāng)程序從鍵盤讀入數(shù)據(jù)時(shí),調(diào)用System.in的read方法,從緩沖區(qū)讀入一個(gè)二進(jìn)制數(shù)據(jù)。使用時(shí)包含在try語句中,并捕獲或者拋出異常。
- (2)標(biāo)準(zhǔn)輸出:System.out是打印輸出流PrintStream的對象。PrintStream類是過濾字節(jié)輸出流FilterOutputStream的一個(gè)子類,定義了print和println等不同的方法向屏幕輸出。
- (3)標(biāo)準(zhǔn)錯(cuò)誤流:System.err用于顯示用戶錯(cuò)誤信息,是由PrintStream派生的類,作用是利用print把錯(cuò)誤打印到屏幕上。使用與out同樣的方法:
例如System.err.print("錯(cuò)誤")
。
代碼示例:
import java.io.*; public class A_2 { public static void main(String[] args){ try{ byte[] b=new byte[128]; System.out.print("請輸入字符:"); int count=System.in.read(b); System.out.print("輸入的是:"); for(int i=0;i<count;i++){ System.out.print(b[i]+" "); System.out.println(); } class InClass=System.in.getClass(); class OutClass=System.out.getClass(); } } }
到此這篇關(guān)于Java超詳細(xì)梳理IO流的使用方法上的文章就介紹到這了,更多相關(guān)Java IO流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)簡單井字棋小游戲代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)簡單井字棋小游戲代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Java_int、double型數(shù)組常用操作工具類(分享)
下面小編就為大家?guī)硪黄狫ava_int、double型數(shù)組常用操作工具類(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08Java的幾個(gè)重要版本_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
jdk8 將在2014年3月份發(fā)布,迄今為止,可能是最大更新的java版本,也是令人期待的一個(gè)版本,在Java中引入閉包概念對Java程序開發(fā)方法的影響甚至?xí)笥贘ava5中引入的泛型特征對編程方式帶來的影響2017-06-06jvm垃圾回收GC調(diào)優(yōu)基礎(chǔ)原理分析
談到調(diào)優(yōu),這一定是針對特定場景、特定目的的事情, 對于 GC 調(diào)優(yōu)來說,首先就需要清楚調(diào)優(yōu)的目標(biāo)是什么?從性能的角度看,通常關(guān)注三個(gè)方面,內(nèi)存占用(footprint)、延時(shí)(latency)和吞吐量(throughput)2022-01-01Mybatis-plus使用TableNameHandler分表詳解(附完整示例源碼)
這篇文章主要介紹了Mybatis-plus使用TableNameHandler分表詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Java工具之ja-netfilter?2022.1?配置教程
這篇文章主要介紹了Java工具之ja-netfilter?2022.1?配置教程,本防火墻基于javaagent,所以目前只有基于java的程序能夠使用,需要的朋友可以參考下2022-04-04詳述 DB2 分頁查詢及 Java 實(shí)現(xiàn)的示例
本篇文章主要介紹了詳述 DB2 分頁查詢及 Java 實(shí)現(xiàn)的示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09spring如何集成cxf實(shí)現(xiàn)webservice接口功能詳解
這篇文章主要給大家介紹了關(guān)于spring如何集成cxf實(shí)現(xiàn)webservice接口功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家 的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-07-07SSH框架網(wǎng)上商城項(xiàng)目第16戰(zhàn)之Hibernate二級緩存處理首頁熱門顯示
這篇文章主要介紹了SSH框架網(wǎng)上商城項(xiàng)目第16戰(zhàn)之Hibernate的二級緩存處理首頁的熱門顯示,感興趣的小伙伴們可以參考一下2016-06-06