JavaIO編程(鍵盤(pán)輸入,緩沖輸入流、Scanner工具、序列化與反序列化)附帶相關(guān)面試題

1.System類對(duì)io的支持
system對(duì)io支持主要有三個(gè)方法
方法描述
System.in
標(biāo)準(zhǔn)輸入流,用于從鍵盤(pán)接收輸入信息。System.out
標(biāo)準(zhǔn)輸出流,用于向控制臺(tái)輸出信息。System.err
標(biāo)準(zhǔn)錯(cuò)誤流,用于向控制臺(tái)輸出錯(cuò)誤信息。
最熟悉的應(yīng)該是system.out,因?yàn)槠綍r(shí)輸出都用到該方法,system.err輸出錯(cuò)誤信息,與一般system.out的區(qū)別在于在編譯工具如idea會(huì)對(duì)system.err有特殊標(biāo)識(shí)
System.in 是通過(guò)鍵盤(pán)輸入數(shù)據(jù)
以下案例將通過(guò)使用鍵盤(pán)輸入實(shí)現(xiàn)數(shù)據(jù)輸入

在案例代碼中可以看到有許多的弊端,1.數(shù)據(jù)需要使用字節(jié)數(shù)組傳輸,一旦數(shù)據(jù)超過(guò)數(shù)組長(zhǎng)度就會(huì)發(fā)生異常2.因?yàn)閟ystem.in是輸入字節(jié)流,所以對(duì)中文處理不夠好

2.BufferReader緩沖輸入流
通過(guò)引入BufferReader緩沖輸入流可以解決上述問(wèn)題。
該流最核心的兩個(gè)方法:
1.public BufferReader(Reader in)接收一個(gè)Reader實(shí)例
2.public String readLine()throws IOException? 一次性將緩沖區(qū)的內(nèi)容讀取出來(lái)
方法描述
BufferedReader(Reader in)
構(gòu)造方法,接收一個(gè)Reader
實(shí)例作為輸入流。readLine()
讀取一行文本,返回一個(gè)字符串。如果已到達(dá)流的末尾,則返回null
。
案例代碼如下:



3.Scanner輸入流工具
Scanner作為工具輸入流,其中有許多的方法,方便輸入時(shí)候用上,以下是一些常用的方法
方法描述
scanner.next()
從輸入中獲取下一個(gè)以空格分隔的字符串。scanner.nextInt()
從輸入中獲取下一個(gè)整數(shù)型數(shù)據(jù)。scanner.hasNext(pattern)
檢查輸入中是否存在與指定正則表達(dá)式pattern
匹配的下一個(gè)字符串。scanner.hasNextInt()
檢查輸入中是否存在下一個(gè)整數(shù)型數(shù)據(jù)。scanner.useDelimiter(delimiter)
設(shè)置輸入分隔符,即用于將輸入拆分為不同部分的字符串。默認(rèn)情況下,分隔符為空格、制表符和換行符。scanner.nextLine()
獲取輸入中的下一行文本(包括回車(chē)符),作為字符串返回。
案例1.使用Scanner實(shí)現(xiàn)鍵盤(pán)數(shù)據(jù)輸入

案例2.輸入日期數(shù)據(jù),并用正則表達(dá)式判斷


4.對(duì)象序列化
一個(gè)對(duì)象作為一串代碼,那么一般情況下無(wú)法通過(guò)對(duì)象引用的方式將其引入文件中,那么此時(shí)就需要對(duì)象序列化,所謂對(duì)象序列化就是將對(duì)象變成二進(jìn)制的數(shù)據(jù)流的方式放入文件中。
想要一個(gè)對(duì)象能夠?qū)崿F(xiàn)序列化那么該類一定要實(shí)現(xiàn)Serializable接口,該接口沒(méi)有任何的功能,其意義只是告訴程序員這個(gè)類的對(duì)象能夠進(jìn)行序列化
想要真正實(shí)現(xiàn)序列化還需要ObjectInputStream與ObjectOutputStream兩個(gè)類實(shí)現(xiàn)
首先是ObjectOutputStream的常用方法:
方法描述
ObjectOutputStream(OutputStream out)
構(gòu)造方法,傳入傳輸?shù)膶?duì)象數(shù)據(jù)流writeObject(Object obj)
將指定對(duì)象寫(xiě)入輸出流
ObjectInputStream的常用方法:
方法描述
ObjectInputStream(InputStream in)
構(gòu)造方法,傳入要讀取的對(duì)象數(shù)據(jù)流readObject()
從輸入流中讀取對(duì)象
具體案例:

?面試題:什么是 java 序列化?什么情況下需要序列化?
序列化就是一種用來(lái)處理對(duì)象流的機(jī)制。將對(duì)象的內(nèi)容流化,將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。
序列化是通過(guò)實(shí)現(xiàn)serializable接口,該接口沒(méi)有需要實(shí)現(xiàn)的方法,implement Serializable只是為了標(biāo)注該對(duì)象是可被序列化的,使用一個(gè)輸出流(FileOutputStream)來(lái)構(gòu)造一個(gè)ObjectOutputStream對(duì)象,接著使用ObjectOutputStream對(duì)象的writeObejct(Object object)方法就可以將參數(shù)的obj對(duì)象到磁盤(pán),需要恢復(fù)的時(shí)候使用輸入流。
序列化是將對(duì)象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^(guò)程。
例如,可以序列化一個(gè)對(duì)象,然后通過(guò)HTTP通過(guò)Internet在客戶端和服務(wù)器之間傳輸該對(duì)象。在另一端,反序列化將從流中心構(gòu)造成對(duì)象。
一般程序在運(yùn)行時(shí),產(chǎn)生對(duì)象,這些對(duì)象隨著程序的停止而消失,但我們想將某些對(duì)象保存下來(lái),這時(shí),我們就可以通過(guò)序列化將對(duì)象保存在磁盤(pán),需要使用的時(shí)候通過(guò)反序列化獲取到。
對(duì)象序列化的最主要目的就是傳遞和保存對(duì)象,保存對(duì)象的完整性和可傳遞性。
譬如通過(guò)網(wǎng)絡(luò)傳輸或者把一個(gè)對(duì)象保存成本地一個(gè)文件的時(shí)候,需要使用序列化。