黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

面試題首頁(yè) > Java基礎(chǔ)面試題

IO面試題

001什么是IO流?

IO流就是以流的方式進(jìn)行輸入輸出。主要用來(lái)處理設(shè)備之間的傳輸,文件的上傳,下載和復(fù)制。
流分輸入和輸出,輸入流從文件中讀取數(shù)據(jù)存儲(chǔ)到進(jìn)程中,輸出流從進(jìn)程中讀取數(shù)據(jù)然后寫(xiě)入到目標(biāo)文件。

002Java 中有幾種類(lèi)型的流?

按照流的方向:輸入流(inputStream)和輸出流(outputStream)
按照實(shí)現(xiàn)功能分:節(jié)點(diǎn)流(可以從或向一個(gè)特定的地方(節(jié)點(diǎn))讀寫(xiě)數(shù)據(jù)。如 FileReader)和處理流(是對(duì)一個(gè)已存在的流的連接和封裝,通過(guò)所封裝的流的功能調(diào)用實(shí)現(xiàn)數(shù)據(jù)讀寫(xiě)。如 BufferedReader。處理流的構(gòu)造方法總是要帶一個(gè)其他的流對(duì)象做參數(shù)。一個(gè)流對(duì)象經(jīng)過(guò)其他流的多次包裝,稱(chēng)為流的鏈接。)
按照處理數(shù)據(jù)的單位: 字節(jié)流和字符流。字節(jié)流繼承于 InputStream 和 OutputStream, 字符流繼承于Reader 和 Writer 。

003字節(jié)流和字符流的區(qū)別?

1)字節(jié)流讀取的時(shí)候,讀到一個(gè)字節(jié)就返回一個(gè)字節(jié);字符流讀取的時(shí)候會(huì)讀到一個(gè)或多個(gè)字節(jié)(這個(gè)要根據(jù)字符流中編碼設(shè)置,一般中文對(duì)應(yīng)的字節(jié)數(shù)是兩個(gè),在UTF-8碼表中是3個(gè)字節(jié))
2)字節(jié)流可以處理所有類(lèi)型數(shù)據(jù),如:圖片,MP3,AVI視頻文件,而字符流只能處理字符數(shù)據(jù)。只要是處理純文本數(shù)據(jù),就要優(yōu)先考慮使用字符流,除此之外都用字節(jié)流。
3)字節(jié)流在操作時(shí)本身不會(huì)用到緩沖區(qū)(內(nèi)存),是文件本身直接操作的,而字符流在操作時(shí)使用了緩沖區(qū),通過(guò)緩沖區(qū)再操作文件。
案例1:在寫(xiě)操作的過(guò)程中,沒(méi)有關(guān)閉字節(jié)流操作,但是文件中也依然存在了輸出的內(nèi)容代碼如下:

public static void main(String[] args) throws Exception { 
    // 第1步:使用File類(lèi)找到一個(gè)文件 
    File f = new File("d:" + File.separator + "test.txt"); // 聲明File 對(duì)象 
    // 第2步:通過(guò)子類(lèi)實(shí)例化父類(lèi)對(duì)象 
    OutputStream out = new FileOutputStream(f); 
    // 第3步:進(jìn)行寫(xiě)操作 
    String str = "Hello World!!!"; // 準(zhǔn)備一個(gè)字符串 
    byte b[] = str.getBytes(); // 字符串轉(zhuǎn)byte數(shù)組 
    out.write(b); // 將內(nèi)容輸出 
    // 第4步:關(guān)閉輸出流 
    // out.close();
} 

案例2:在寫(xiě)操作的過(guò)程中,沒(méi)有關(guān)閉字符流操作,發(fā)現(xiàn)文件中沒(méi)有任何內(nèi)容輸出。代碼如下:

public static void main(String[] args) throws Exception {         
    // 第1步:使用File類(lèi)找到一個(gè)文件    
    File f = new File("d:" + File.separator + "test.txt");// 聲明File 對(duì)象    
    // 第2步:通過(guò)子類(lèi)實(shí)例化父類(lèi)對(duì)象    
    Writer out = new FileWriter(f);            
    // 第3步:進(jìn)行寫(xiě)操作    
    String str = "Hello World!!!"; // 準(zhǔn)備一個(gè)字符串    
    out.write(str); // 將內(nèi)容輸出
    out.flush();     
    // 第4步:關(guān)閉輸出流    
    // out.close();  
}  

這是因?yàn)樽址鞑僮鲿r(shí)使用了緩沖區(qū),而在關(guān)閉字符流時(shí)會(huì)強(qiáng)制性地將緩沖區(qū)中的內(nèi)容進(jìn)行輸出,但是如果程序沒(méi)有關(guān)閉,則緩沖區(qū)中的內(nèi)容是無(wú)法輸出的。當(dāng)然如果在不關(guān)閉字符流的情況下也可以使用Writer類(lèi)中的flush()強(qiáng)制性的清空緩存,從而將字符流的內(nèi)容全部輸出。

004怎么樣把字節(jié)流轉(zhuǎn)換成字符流,說(shuō)出它的步驟?

解題思路:把字節(jié)流轉(zhuǎn)成字符流就要用到適配器模式,需要用到OutputStreamWriter。它繼承了Writer接口,但要?jiǎng)?chuàng)建它必須在構(gòu)造函數(shù)中傳入一個(gè)OutputStream的實(shí)例,OutputStreamWriter的作用也就是將OutputStream適配到Writer。它實(shí)現(xiàn)了Reader接口,并且持有了InputStream的引用。利用轉(zhuǎn)換流OutputStreamWriter.創(chuàng)建一個(gè)字節(jié)流對(duì)象,將其作為參數(shù)傳入轉(zhuǎn)換流OutputStreamWriter中得到字符流對(duì)象.

005什么是序列化?

序列化是指把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程,序列化后的字節(jié)流保存了對(duì)象的狀態(tài)以及相關(guān)的描述信息,從而方便在網(wǎng)絡(luò)上傳輸或者保存在本地文件中,達(dá)到對(duì)象狀態(tài)的保存與重建的目的。
反序列化:客戶(hù)端從文件中或網(wǎng)絡(luò)上獲得序列化后的對(duì)象字節(jié)流后,根據(jù)字節(jié)流中所保存的對(duì)象狀態(tài)及描述信息,通過(guò)反序列化重建對(duì)象。
序列化的優(yōu)勢(shì):一是實(shí)現(xiàn)了數(shù)據(jù)的持久化,通過(guò)序列化可以把數(shù)據(jù)永久地保存到硬盤(pán)上(通常存放在文件里),二是,利用序列化實(shí)現(xiàn)遠(yuǎn)程通信,即在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。三是通過(guò)序列化在進(jìn)程間傳遞對(duì)象;

006IO如何實(shí)現(xiàn)序列化和反序列化?

(1)java.io.ObjectOutputStream:表示對(duì)象輸出流;它的writeObject(Object obj)方法可以對(duì)參數(shù)指定的obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫(xiě)到一個(gè)目標(biāo)輸出流中;
(2)java.io.ObjectInputStream:表示對(duì)象輸入流;它的readObject()方法源輸入流中讀取字節(jié)序列,再把它們反序列化成為一個(gè)對(duì)象,并將其返回;
注意:只有實(shí)現(xiàn)了Serializable或Externalizable接口的類(lèi)的對(duì)象才能被序列化,否則拋出異常!

序列化和反序列化的示例

public class SerialDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
	    //序列化
        FileOutputStream fos = new FileOutputStream("object.out");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        User user1 = new User("xuliugen", "123456", "male");
        oos.writeObject(user1);
        oos.flush();
        oos.close();
		//反序列化
        FileInputStream fis = new FileInputStream("object.out");
        ObjectInputStream ois = new ObjectInputStream(fis);
        User user2 = (User) ois.readObject();
        System.out.println(user2.getUserName()+ " " + 
	    user2.getPassword() + " " + user2.getSex());
        //反序列化的輸出結(jié)果為:xuliugen 123456 male
    }
}
public class User implements Serializable {
    private String userName;
    private String password;
    private String sex;
    //全參構(gòu)造方法、get和set方法省略
}

007PrintStream、BufferedWriter、PrintWriter 的比較?

1. PrintStream 類(lèi)的輸出功能非常強(qiáng)大,通常如果需要輸出文本內(nèi)容,都應(yīng)該將輸出流包裝成PrintStream 后進(jìn)行輸出。它還提供其他兩項(xiàng)功能。與其他輸出流不同,PrintStream 永遠(yuǎn)不會(huì)拋出 IOException;而是,異常情況僅設(shè)置可通過(guò) checkError 方法測(cè)試的內(nèi)部標(biāo)志。另外,為了自動(dòng)刷新,可以創(chuàng)建一個(gè) PrintStream 
2.BufferedWriter:將文本寫(xiě)入字符輸出流,緩沖各個(gè)字符從而提供單個(gè)字符,數(shù)組和字符串的高效寫(xiě)入。通過(guò) write()方法可以將獲取到的字符輸出,然后通過(guò) newLine()進(jìn)行換行操作。BufferedWriter 中的字符流必須通過(guò)調(diào)用 flush 方法才能將其刷出去。并且 BufferedWriter 只能對(duì)字符流進(jìn)行操作。如果要對(duì)字節(jié)流操作,則使用 BufferedInputStream
3.PrintWriter 的 println 方法自動(dòng)添加換行,不會(huì)拋異常,若關(guān)心異常,需要調(diào)用 checkError方法看是否有異常發(fā)生,PrintWriter 構(gòu)造方法可指定參數(shù),實(shí)現(xiàn)自動(dòng)刷新緩存(autoflush)。

008如果我要對(duì)字節(jié)流進(jìn)行大量的從硬盤(pán)讀取,要用那個(gè)流,為什么?

因?yàn)槊鞔_說(shuō)了是對(duì)字節(jié)流的讀取,所以肯定是InputStream或者他的子類(lèi),又因?yàn)橐罅孔x取,肯定要考慮到高效的問(wèn)題,自然想到緩沖流BufferedInputStream。
原因:BufferedInputStream是InputStream的緩沖流,使用它可以防止每次讀取數(shù)據(jù)時(shí)進(jìn)行實(shí)際的寫(xiě)操作,代表著使用緩沖區(qū)。不帶緩沖的操作,每讀一個(gè)字節(jié)就要寫(xiě)入一個(gè)字節(jié),由于涉及磁盤(pán)的IO操作相比內(nèi)存的操作要慢很多,所以不帶緩沖的流效率很低。帶緩沖的流,可以一次讀很多字節(jié),但不向磁盤(pán)中寫(xiě)入,只是先放到內(nèi)存里。等湊夠了緩沖區(qū)大小的時(shí)候一次性寫(xiě)入磁盤(pán),這種方式可以減少磁盤(pán)操作次數(shù),速度就會(huì)提高很多!并且也可以減少對(duì)磁盤(pán)的損傷。

目錄

返回頂部
主站蜘蛛池模板: 欧美成人在线观看 | 国产一区精品在线观看 | 日本黄色小说网 | 亚洲大胆美女人体一二三区 | 日本jizz强视频69视频 | 中文字幕一区二区区免 | 国产视频一区二 | 香蕉污视频在线观看 | 在线一区视频 | 成人国产免费 | 激情影院成人区免费观看视频 | 天天摸天天干 | 国产极品粉嫩 | 精品一卡二卡三视频 | 丝袜美腿极品老师系列集合 | 在线天堂中文字幕 | 天天射天天爱天天干 | 日批网站免费 | 香蕉色综合 | 天天看天天摸天天操 | 精品欧美| 免费一级毛片在线视频观看 | 伊人婷婷在线 | 动漫美女羞羞网站 | 涩涩涩丁香色婷五月网视色 | 最新国产三级 | 中国黄色网址 | 在线精品国内外视频 | 天天舔天天射天天操 | 亚洲国产天堂久久综合网站 | 青草视频网站在线观看 | 很黄很色又爽很黄很色又爽 | 国产精品欧美亚洲韩国日本 | 日韩视频欧美视频 | 久久88香港三级 | h视频在线免费观看 | 国产亚洲一路线二路线高质量 | 一区二区亚洲视频 | 亚洲成年网站在线观看 | 成人网在线视频 | 蜜月mv国产精品 |