




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
文檔來源網(wǎng)絡侵權聯(lián)系刪除PAGEPAGE1僅供參考java.io包下的類有哪些+面試題IO介紹IO是Input/Output的縮寫,它是基于流模型實現(xiàn)的,比如操作文件時使用輸入流和輸出流來寫入和讀取文件等。IO分類傳統(tǒng)的IO,按照流類型我們可以分為:字符流字節(jié)流其中,字符流包括Reader、Writer;字節(jié)流包括InputStream、OutputStream。
傳統(tǒng)IO的類關系圖,如下圖所示:avatarIO使用了解了IO之間的關系,下面我們正式進入實戰(zhàn)環(huán)節(jié),分別來看字符流(Reader、Writer)和字節(jié)流(InputStream、OutputStream)的使用。①Writer使用Writer可用來寫入文件,請參考以下代碼://給指定目錄下的文件追加信息
Writerwriter=newFileWriter("d:\\io.txt",true);
writer.append("老王");
writer.close();這幾行簡單的代碼就可以實現(xiàn)把信息老王追加到d:\\io.txt的文件下,參數(shù)二表示的是覆蓋文字還是追加文字。②Reader使用Reader可用來讀取文件,請參考以下代碼:Readerreader=newFileReader("d:\\io.txt");
BufferedReaderbufferedReader=newBufferedReader(reader);
Stringstr=null;
//逐行讀取信息
while(null!=(str=bufferedReader.readLine())){
System.out.println(str);
}
bufferedReader.close();
reader.close();③InputStream使用InputStream可用來讀取文件,請參考以下代碼:InputStreaminputStream=newFileInputStream(newFile("d:\\io.txt"));
byte[]bytes=newbyte[inputStream.available()];
//讀取到byte數(shù)組
inputStream.read(bytes);
//內容轉換為字符串
Stringcontent=newString(bytes,"UTF-8");
inputStream.close();④OutputStream使用OutputStream可用來寫入文件,請參考以下代碼:OutputStreamoutputStream=newFileOutputStream(newFile("d:\\io.txt"),true);
outputStream.write("老王".getBytes());
outputStream.close();NIO介紹上面講的內容都是java.io包下的知識點,但隨著Java的不斷發(fā)展,在Java1.4時新的IO包出現(xiàn)了java.nio,NIO(Non-BlockingIO)的出現(xiàn)解決了傳統(tǒng)IO,也就是我們經(jīng)常說的BIO(BlockingIO)同步阻塞的問題,NIO提供了Channel、Selector和Buffer等概念,可以實現(xiàn)多路復用和同步非阻塞IO操作,從而大大提升了IO操作的性能。
前面提到同步和阻塞的問題,那下面來看看同步和阻塞結合都有哪些含義。組合方式性能分析同步阻塞最常用的一種用法,使用也是最簡單的,但是I/O性能一般很差,CPU大部分在空閑狀態(tài)同步非阻塞提升I/O性能的常用手段,就是將I/O的阻塞改成非阻塞方式,尤其在網(wǎng)絡I/O是長連接,同時傳輸數(shù)據(jù)也不是很多的情況下,提升性能非常有效。這種方式通常能提升I/O性能,但是會增加CPU消耗,要考慮增加的I/O性能能不能補償CPU的消耗,也就是系統(tǒng)的瓶頸是在I/O還是在CPU上
異步阻塞|這種方式在分布式數(shù)據(jù)庫中經(jīng)常用到。例如,在往一個分布式數(shù)據(jù)庫中寫一條記錄,通常會有一份是同步阻塞的記錄,而還有兩至三份是備份記錄會寫到其他機器上,這些備份記錄通常都是采用異步阻塞的方式寫I/O;異步阻塞對網(wǎng)絡I/O能夠提升效率,尤其像上面這種同時寫多份相同數(shù)據(jù)的情況
異步非阻塞|這種組合方式用起來比較復雜,只有在一些非常復雜的分布式情況下使用,像集群之間的消息同步機制一般用這種I/O組合方式。例如,Cassandra的Gossip通信機制就是采用異步非阻塞的方式。它適合同時要傳多份相同的數(shù)據(jù)到集群中不同的機器,同時數(shù)據(jù)的傳輸量雖然不大,但是卻非常頻繁。這種網(wǎng)絡I/O用這個方式性能能達到最高了解了同步和阻塞的含義,下面來看NIO的具體使用,請參考以下代碼:intport=6666;
newThread(newRunnable(){
@Override
publicvoidrun(){
try(Selectorselector=Selector.open();
ServerSocketChannelserverSocketChannel=ServerSocketChannel.open();){
serverSocketChannel.bind(newInetSocketAddress(InetAddress.getLocalHost(),port));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);
while(true){
selector.select();//阻塞等待就緒的Channel
Set<SelectionKey>selectionKeys=selector.selectedKeys();
Iterator<SelectionKey>iterator=selectionKeys.iterator();
while(iterator.hasNext()){
SelectionKeykey=iterator.next();
try(SocketChannelchannel=((ServerSocketChannel)key.channel()).accept()){
channel.write(Charset.defaultCharset().encode("老王,你好~"));
}
iterator.remove();
}
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();
newThread(newRunnable(){
@Override
publicvoidrun(){
//Socket客戶端1(接收信息并打?。?/p>
try(SocketcSocket=newSocket(InetAddress.getLocalHost(),port)){
BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(cSocket.getInputStream()));
bufferedReader.lines().forEach(s->System.out.println("客戶端1打?。?+s));
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();
newThread(newRunnable(){
@Override
publicvoidrun(){
//Socket客戶端2(接收信息并打?。?/p>
try(SocketcSocket=newSocket(InetAddress.getLocalHost(),port)){
BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(cSocket.getInputStream()));
bufferedReader.lines().forEach(s->System.out.println("客戶端2打?。?+s));
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();以上代碼創(chuàng)建了兩個Socket客戶端,用于收取和打印服務器端的消息。
其中,服務器端通過SelectionKey(選擇鍵)獲取到SocketChannel(通道),而通道都注冊到Selector(選擇器)上,所有的客戶端都可以獲得對應的通道,而不是所有客戶端都排隊堵塞等待一個服務器連接,這樣就實現(xiàn)多路復用的效果了。多路指的是多個通道(SocketChannel),而復用指的是一個服務器端連接重復被不同的客戶端使用。AIO介紹AIO(AsynchronousIO)是NIO的升級,也叫NIO2,實現(xiàn)了異步非堵塞IO,異步IO的操作基于事件和回調機制。
AIO實現(xiàn)簡單的Socket服務器,代碼如下:intport=8888;
newThread(newRunnable(){
@Override
publicvoidrun(){
AsynchronousChannelGroupgroup=null;
try{
group=AsynchronousChannelGroup.withThreadPool(Executors.newFixedThreadPool(4));
AsynchronousServerSocketChannelserver=AsynchronousServerSocketChannel.open(group).bind(newInetSocketAddress(InetAddress.getLocalHost(),port));
server.accept(null,newCompletionHandler<AsynchronousSocketChannel,AsynchronousServerSocketChannel>(){
@Override
publicvoidcompleted(AsynchronousSocketChannelresult,AsynchronousServerSocketChannelattachment){
server.accept(null,this);//接收下一個請求
try{
Future<Integer>f=result.write(Charset.defaultCharset().encode("Hi,老王"));
f.get();
System.out.println("服務端發(fā)送時間:"+DateFormat.getDateTimeInstance().format(newDate()));
result.close();
}catch(InterruptedException|ExecutionException|IOExceptione){
e.printStackTrace();
}
}
@Override
publicvoidfailed(Throwableexc,AsynchronousServerSocketChannelattachment){
}
});
group.awaitTermination(Long.MAX_VALUE,TimeUnit.SECONDS);
}catch(IOException|InterruptedExceptione){
e.printStackTrace();
}
}
}).start();
//Socket客戶端
AsynchronousSocketChannelclient=AsynchronousSocketChannel.open();
Future<Void>future=client.connect(newInetSocketAddress(InetAddress.getLocalHost(),port));
future.get();
ByteBufferbuffer=ByteBuffer.allocate(100);
client.read(buffer,null,newCompletionHandler<Integer,Void>(){
@Override
publicvoidcompleted(Integerresult,Voidattachment){
System.out.println("客戶端打?。?+newString(buffer.array()));
}
@Override
publicvoidfailed(Throwableexc,Voidattachment){
exc.printStackTrace();
try{
client.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
});
Thread.sleep(10*1000);相關面試題1.使用以下哪個方法來判斷一個文件是否存在?A:createFile
B:exists
C:read
D:exist答:B2.以下說法錯誤的是?A:同步操作不一定會阻塞
B:異步操作不一定會阻塞
C:阻塞一定是同步操作
D:同步或異步都可能會阻塞答:C題目解析:異步操作也可能會阻塞,比如分布式集群消息同步,采用的就是異步阻塞的方式。3.BIO、NIO、AIO的區(qū)別是什么?答:它們三者的區(qū)別如下。BIO就是傳統(tǒng)的java.io包,它是基于流模型實現(xiàn)的,交互的方式是同步、阻塞方式,也就是說在讀入輸入流或者輸出流時,在讀寫動作完成之前,線程會一直阻塞在那里,它們之間的調用是可靠的線性順序。它的優(yōu)點就是代碼比較簡單、直觀;缺點就是IO的效率和擴展性很低,容易成為應用性能瓶頸。NIO是Java1.4引入的java.nio包,提供了Channel、Selector、Buffer等新的抽象,可以構建多路復用的、同步非阻塞IO程序,同時提供了更接近操作系統(tǒng)底層高性能的數(shù)據(jù)操作方式。AIO是Java1.7之后引入的包,是NIO的升級版本,提供了異步非堵塞的IO操作方式,因此人們叫它AIO(AsynchronousIO),異步IO是基于事件和回調機制實現(xiàn)的,也就是應用操作之后會直接返回,不會堵塞在那里,當后臺處理完成,操作系統(tǒng)會通知相應的線程進行后續(xù)的操作。簡單來說BIO就是傳統(tǒng)IO包,產(chǎn)生的最早;NIO是對BIO的改進提供了多路復用的同步非阻塞IO,而AIO是NIO的升級,提供了異步非阻塞IO。4.讀取和寫入文件最簡潔的方式是什么?答:使用Java7提供的Files讀取和寫入文件是最簡潔,請參考以下代碼://讀取文件
byte[]bytes=Files.readAllBytes(Paths.get("d:\\io.txt"));
//寫入文件
Files.write(Paths.get("d:\\io.txt"),"追加內容".getBytes(),StandardOpenOption.APPEND);讀取和寫入都是一行代碼搞定,可以說很簡潔了。5.Files常用方法都有哪些?答:Files是Java1.7提供的,使得文件和文件夾的操作更加方便,它的常用方法有以下幾個:Files.exists():檢測文件路徑是否存在Files.createFile():創(chuàng)建文件Files.createDirectory():創(chuàng)建文件夾Files.delete():刪除一個文件或目錄Files.copy():復制文件Files.move():移動文件Files.size():查看文件個數(shù)Files.read():讀取文件Files.write():寫入文件6.FileInputStream可以實現(xiàn)什么功能?答:FileInputStream可以實現(xiàn)文件的讀取。題目解析:因為FileInputStream和FileOutputStream很容易被記反,F(xiàn)ileOutputStream才是用來寫入文件的,所以也經(jīng)常被面試官問到。7.不定項選擇:為了提高讀寫性能,可以采用什么流?A:InputStream
B:DataInputStream
C:BufferedReader
D:BufferedInputStream
E:OutputStream
F:BufferedOutputStream答:D、F題目解析:BufferedInputStream是一種帶緩存區(qū)的輸入流,在讀取字節(jié)數(shù)據(jù)時可以從底層流中一次性讀取多個字節(jié)到緩存區(qū),而不必每次都調用系統(tǒng)底層;同理,BufferedOutputStream也是一種帶緩沖區(qū)的輸出流,通過緩沖區(qū)輸出流,應用程序先把字節(jié)寫入緩沖區(qū),緩存區(qū)滿后再調用操作系統(tǒng)底層,從而提高系統(tǒng)性能,而不必每次都去調用系統(tǒng)底層方法。8.FileInputStream和BufferedInputStream的區(qū)別是什么?答:FileInputStream在小文件讀寫時性能較好,而在大文件操作時使用BufferedInputStream更有優(yōu)勢。9.以下這段代碼運行在Windwos平臺,執(zhí)行的結果是?Files.createFile(Paths.get("c:\\pf.txt"),PosixFilePermissions.asFileAttribute(
EnumSet.of(PosixFilePermission.OWNER_READ)));A:在指定的盤符產(chǎn)生了對應的文件,文件只讀
B:在指定的盤符產(chǎn)生了對應的文件,文件只寫
C:在指定的盤符產(chǎn)生了對應的文件,文件可讀寫
D:程序報錯答:D題目解析:本題目考察的是Files.createFile參數(shù)傳遞的問題,PosixFilePermissions不支持Windows,因此在Windows執(zhí)行會報錯java.lang.UnsupportedOperationException:‘posix:permissions’notsupportedasinitialattribute??偨Y在Java1.4之前只有BIO(BlockingIO)可供使用,也就是java.io包下的那些類,它的缺點是同步阻塞式運行的。隨后在Java1.4時,提供了NIO(Non-BlockingIO)屬于BIO的升級,提供了同步非阻塞的IO操作方式,它的重要組件是Selector(選擇器)、Channel(通道)、Buffer(高效數(shù)據(jù)容器)實現(xiàn)了多路復用的高效IO操作。而AIO(AsynchronousIO)也叫NIO2.0,屬于NIO的補充和升級,提供了異步非阻塞的IO操作。還有另一個重要的知識點,是Java7.0時新增的Files類,極大地提升了文件操作的便利性,比如讀、寫文件Files.write()、Files.readAllBytes()等,都是非常簡便和實用的方法。 如何輕松獲得Offer你好,我是王磊,某上市公司技術研發(fā)經(jīng)理,前奇虎360員工,有著10余年的編程工作經(jīng)驗,目前主要負責新員工技術面試和構建企業(yè)技術架構的相關事宜。隨著面試過的人數(shù)增加,我發(fā)現(xiàn)面試者們暴露出了技術方面的很多問題,為了讓更多面試者少走一些彎路,也為了讓企業(yè)能招到合適的技術人才,于是就誕生了這個專欄。為了寫好這個專欄內容,我先后拜訪了一二十家互聯(lián)網(wǎng)公司,與不同的面試官和面試者進行面對面探討,深入了解了企業(yè)對于面試者的要求和常見的Java面試題型。之后我花了大半年的時間,結合自己4年多作為面試官的經(jīng)歷,把這些內容整理成文,用大約10萬字的內容對Java的核心知識點和常見的500多道面試題,做了詳細的介紹,也就是本專欄中你所看到的全部內容,希望對你能有所幫助。為什么要學這個專欄內容?「因為它能為你贏得面試的主動權,讓你獲得更多的Offer?!箯臉I(yè)十多年,我從面試者變成面試官,在Java面試上積累了比較豐富的經(jīng)驗。其實,很多面試者在搜集面試資料的時候都踩過一些“坑”,你是不是也遇到過:免費搜索的面試題,內容不全面,這就算了,有時候答案都不準確;很多培訓機構提供的面試寶典內容雖然不少,但深度不夠,且面試題過于老舊脫離了企業(yè)實際需要;還有很多付費的面試題存在濫竽充數(shù),提供了很多沒有價值的面試題,錢花了,干貨沒學到;市面上大部分面試題只講了基礎概念,沒有提供題目解析和示例代碼,不利于讀者真正的掌握背后的原理,只能死記硬背,且容易忘記。為了規(guī)避這些“坑”,我跑了很多家互聯(lián)網(wǎng)公司,來確認Java面試中實際考察的高頻知識點和常見題型。可是有了第一手素材后,我要如何讓大家真正從我的講解中學到干貨、用到實處呢?經(jīng)過反復驗證,我才設計了如下的內容講述模式。第一,500+面試題詳解。如果你是還沒走入職場的新人,我會為你提供完整的Java技術棧講解,以及最新、最全、最實用的500多道Java面試題詳解。第二,10萬字Java核心知識點梳理。本專欄的每一篇內容,都采用的是「核心知識點+N道相關面試題」的模式,讓你不單能應付面試,還能學到更多的Java核心知識。第三,技術、面試搭配平衡,不但讓你學到心里,還助你展示出來。面對目前技術市場的相對冷淡和一個職位多個應聘者競爭的現(xiàn)狀,面試者們只有掌握更多Java核心技能和面試理論知識,才能在眾多面試者中脫穎而出。本專欄每篇文章大致分為兩個部分:Java核心點介紹+相關面試題詳解,這兩部分內容相輔相成,前面的核心知識點介紹讓后面的面試題更容易理解,后面的面試題加深了讀者對于Java核心點的掌握。如此一來,讓你所學及所用,不僅能夠應付面試,更能學習到更多有價值的Java技術點,讓你在面試中和工作中都能展示的更加出色。專欄大綱本專欄分為七大部分,共計37講,約10萬字。第一部分:Java基礎強化這部分包含7篇文章,我會從Java最基礎的內容講起。有最常見的String面試題從表象到原理的深入講解;還有Java8中新特性的介紹,比如時間和日期模塊,讓你使用更簡潔和優(yōu)化的方式寫出更完美的代碼;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 ISO/IEC 23008-2:2025 EN Information technology - High efficiency coding and media delivery in heterogeneous environments - Part 2: High efficiency video coding
- 精簡年終述職報告
- 對供應商的管理
- 保險行業(yè)未來發(fā)展前景
- 2025年六班級班主任工作方案
- 2025年社區(qū)防汛搶險活動方案
- 畢業(yè)論文答辯結構化展示
- 2025年幼兒園母親節(jié)方案
- 山東建筑大學《第二外國語(3)》2023-2024學年第二學期期末試卷
- 北京中醫(yī)藥大學東方學院《JavaWeb程序設計實驗》2023-2024學年第二學期期末試卷
- 2025年蘇美達股份有限公司招聘筆試參考題庫含答案解析
- 互聯(lián)網(wǎng)醫(yī)院建設與運營模式
- 《質譜分析方惠群版》課件
- 【MOOC】學術英語演講-南京航空航天大學 中國大學慕課MOOC答案
- 大班春天《我們找到的春天》課件
- 專業(yè)鋼結構拆除方案(完整詳細版)
- 照明燈具技術規(guī)格書
- 辦公樓裝飾裝修工程施工組織設計方案
- 基于arduino交通燈課程設計
- 2023年證券公司高級管理人員資質考試真題(附帶答案)
- 記敘文、議論文答題模板(簡化版)
評論
0/150
提交評論