Java知識面試題複習(五)JavaIO流和反射

manor的大數據奮鬥之路 2021-08-15 21:37:06 阅读数:351

本文一共[544]字,预计阅读时长:1分钟~
java javaio 反射

IO流

java 中 IO 流分為幾種?

按照流的流向分,可以分為輸入流和輸出流;
按照操作單元劃分,可以劃分為字節流和字符流;
按照流的角色劃分為節點流和處理流。
Java Io流共涉及40多個類,這些類看上去很雜亂,但實際上很有規則,而且彼此之間存在非常緊密的聯系, Java I0流的40多個類都是從如下4個抽象類基類中派生出來的。

InputStream/Reader:
所有的輸入流的基類,前者是字節輸入流,後者是字符輸入流。
OutputStream/Writer:
所有輸出流的基類,前者是字節輸出流,後者是字符輸出流。

按操作方式分類結構圖:
在這裏插入圖片描述

按操作對象分類結構圖:
在這裏插入圖片描述

BIO,NIO,AIO 有什麼區別?
簡答

BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統 IO,它的特點是模式簡單使用方便,並發處理能力低。 NIO:Non IO
同步非阻塞 IO,是傳統 IO 的昇級,客戶端和服務器端通過 Channel(通道)通訊,實現了多路複用。 AIO:Asynchronous
IO 是 NIO 的昇級,也叫 NIO2,實現了异步非堵塞 IO ,异步 IO 的操作基於事件和回調機制。

詳細回答

BIO (Blocking I/O): 同步阻塞I/O模式,數據的讀取寫入必須阻塞在一個線程內等待其完成。在活動連接數不是特別高(小於單機1000)的情况下,這種模型是比較不錯的,可以讓每一個連接專注於自己的 I/O 並且編程模型簡單,也不用過多考慮系統的過載、限流等問題。線程池本身就是一個天然的漏鬥,可以緩沖一些系統處理不了的連接或請求。但是,當面對十萬甚至百萬級連接的時候,傳統的 BIO 模型是無能為力的。因此,我們需要一種更高效的 I/O 處理模型來應對更高的並發量。
NIO (New I/O): NIO是一種同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,對應 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解為Non-blocking,不單純是New。它支持面向緩沖的,基於通道的I/O操作方法。 NIO提供了與傳統BIO模型中的 Socket 和 ServerSocket 相對應的 SocketChannel 和 ServerSocketChannel 兩種不同的套接字通道實現,兩種通道都支持阻塞和非阻塞兩種模式。阻塞模式使用就像傳統中的支持一樣,比較簡單,但是性能和可靠性都不好;非阻塞模式正好與之相反。對於低負載、低並發的應用程序,可以使用同步阻塞I/O來提昇開發速率和更好的維護性;對於高負載、高並發的(網絡)應用,應使用 NIO 的非阻塞模式來開發
AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改進版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基於事件和回調機制實現的,也就是應用操作之後會直接返回,不會堵塞在那裏,當後臺處理完成,操作系統會通知相應的線程進行後續的操作。AIO 是异步IO的縮寫,雖然 NIO 在網絡操作中,提供了非阻塞的方法,但是 NIO 的 IO 行為還是同步的。對於 NIO 來說,我們的業務線程是在 IO 操作准備好時,得到通知,接著就由這個線程自行進行 IO 操作,IO操作本身是同步的。查閱網上相關資料,我發現就目前來說 AIO 的應用還不是很廣泛,Netty 之前也嘗試使用過 AIO,不過又放弃了。

Files的常用方法都有哪些?

Files. exists():檢測文件路徑是否存在。
Files. createFile():創建文件。
Files. createDirectory():創建文件夾。
Files. delete():删除一個文件或目錄。
Files. copy():複制文件。
Files. move():移動文件。
Files. size():查看文件個數。
Files. read():讀取文件。
Files. write():寫入文件。

反射

什麼是反射機制?

JAVA反射機制是在運行狀態中,對於任意一個類,都能够知道這個類的所有屬性和方法;對於任意一個對象,都能够調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

靜態編譯和動態編譯

**靜態編譯:**在編譯時確定類型,綁定對象
**動態編譯:**運行時確定類型,綁定對象

反射機制優缺點

優點: 運行期類型的判斷,動態加載類,提高代碼靈活度。
缺點: 性能瓶頸:反射相當於一系列解釋操作,通知 JVM 要做的事情,性能比直接的java代碼要慢很多。
反射機制的應用場景有哪些?
反射是框架設計的靈魂。

在我們平時的項目開發過程中,基本上很少會直接使用到反射機制,但這不能說明反射機制沒有用,實際上有很多設計、開發都與反射機制有關,例如模塊化的開發,通過反射去調用對應的字節碼;動態代理設計模式也采用了反射機制,還有我們日常使用的 Spring/Hibernate 等框架也大量使用到了反射機制。

舉例:
①我們在使用JDBC連接數據庫時使用Class.forName()通過反射加載數據庫的驅動程序;
②Spring框架也用到很多反射機制,最經典的就是xml的配置模式。
Spring 通過 XML 配置模式裝載 Bean 的過程:
1) 將程序內所有 XML 或 Properties 配置文件加載入內存中;
2)Java類裏面解析xml或properties裏面的內容,得到對應實體類的字節碼字符串以及相關的屬性信息;
3)使用反射機制,根據這個字符串獲得某個類的Class實例;
4)動態配置實例的屬性

Java獲取反射的三種方法

1.通過new對象實現反射機制 2.通過路徑實現反射機制 3.通過類名實現反射機制

public class Student {

private int id;
String name;
protected boolean sex;
public float score;
}
public class Get {

//獲取反射機制三種方式
public static void main(String[] args) throws ClassNotFoundException {

//方式一(通過建立對象)
Student stu = new Student();
Class classobj1 = stu.getClass();
System.out.println(classobj1.getName());
//方式二(所在通過路徑-相對路徑)
Class classobj2 = Class.forName("fanshe.Student");
System.out.println(classobj2.getName());
//方式三(通過類名)
Class classobj3 = Student.class;
System.out.println(classobj3.getName());
}
}

原文鏈接:https://blog.csdn.net/ThinkWon/article/details/104390612

版权声明:本文为[manor的大數據奮鬥之路]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815213646809E.html