【JAVA基礎篇】IO流

一、流的概念

“對語言設計人員來說,創建好的輸入/輸出系統是一項特別困難的任務。”

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?――《Think in Java》

無論是系統、還是語言的設計中IO的設計都是異常復雜的。面臨的最大的挑戰一般是如何覆蓋所有可能的因素,我們不僅僅要考慮文件、控制臺、網絡、內存等不同的種類,而且要處理大量的不同的讀取方式,如:順序讀取、隨機讀取,二進制讀取、字符讀取,按行讀取、按字符讀取……

為了解決輸入/輸出問題,創建了Java IO體系,并且提出了流的概念。

如何理解流的概念?聯想一下現實生活中水流,自來水公司通過管道將水送入千家萬戶,數據相當于現實生活中的水,JAVA中的流相當于現實生活中的管道。在Java中,流代表任何有能力產出數據的數據源對象或者是有能力接受數據的接收端對象,流的作用是數據傳輸,根據數據傳輸特性將流抽象為各種類,方便更直觀的進行數據操作。

ps:當面試問到你對流的理解時,可以拿生活中的自來水來做對比或者從面對對象的角度來討論。

二、Java IO體系

1、基于字節的IO操作

2、基于字符的IO操作

從上圖可以看到,整個Java IO體系都是基于字節流(InputStream/OutputStream) 和字節流(Reader/Writer)作為基類,根據不同的數據載體或功能派生出來的。

3、分類

按照數據單位來分:字節流、字符流

按照方向分:輸入流、輸出流

按照功能來分:節點流、處理流(直接與底層文件資源連接的稱為節點流,對節點流進行包裝從而完成更高級功能的稱為處理流,處理流在構造時須為其指定一個節點流.)

三、擴展

下面我們來看一下JDK1.8的源代碼

3.1、源代碼

3.1.1、InputStream

    public abstract int read() throws IOException;//從輸入流中讀取一個字節(值0-255)并返回,子類必須提供此方法的實現,如果到達了流的末尾,則返回-1public int read(byte b[]) throws IOException {return read(b, 0, b.length);}/*** 實際上還是調用read()方法,將讀到的內容放到字節數組中b,返回-1(已讀到流的末尾)或者實際讀取的字節數*/public int read(byte b[], int off, int len) throws IOException {if (b == null) {throw new NullPointerException();} else if (off < 0 || len < 0 || len > b.length - off) {throw new IndexOutOfBoundsException();} else if (len == 0) {return 0;}int c = read();if (c == -1) {return -1;}b[off] = (byte)c;int i = 1;try {for (; i < len ; i++) {c = read();if (c == -1) {break;}b[off + i] = (byte)c;}} catch (IOException ee) {}return i;}/*** 跳過n個字節,實際上還是調用read()方法,所以read()方法很關鍵,返回實際跳過的字節數*/public long skip(long n) throws IOException {long remaining = n;int nr;if (n <= 0) {return 0;}int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining);byte[] skipBuffer = new byte[size];while (remaining > 0) {nr = read(skipBuffer, 0, (int)Math.min(size, remaining));if (nr < 0) {break;}remaining -= nr;}return n - remaining;}

上面的源碼和注釋分析了read方法和skip的作用。

3.1.2、OutputStream

    public abstract void write(int b) throws IOException;//將指定字節寫入輸出流,只會寫入低8位,高的24位會被忽略,因為一個字節只有8個bit位public void write(byte b[]) throws IOException {write(b, 0, b.length);}public void write(byte b[], int off, int len) throws IOException {if (b == null) {throw new NullPointerException();} else if ((off < 0) || (off > b.length) || (len < 0) ||((off + len) > b.length) || ((off + len) < 0)) {throw new IndexOutOfBoundsException();} else if (len == 0) {return;}for (int i = 0 ; i < len ; i++) {write(b[off + i]);}}

3.1.3、Reader

    abstract public int read(char cbuf[], int off, int len) throws IOException;//將字符讀入數組,此方法可能會發生阻塞,返回-1或者讀入的字符數public int read(char cbuf[]) throws IOException {return read(cbuf, 0, cbuf.length);}/*** 將字符讀入字符緩沖區*/public int read(java.nio.CharBuffer target) throws IOException {int len = target.remaining();char[] cbuf = new char[len];int n = read(cbuf, 0, len);if (n > 0)target.put(cbuf, 0, n);return n;}/*** 讀取單個字符*/public int read() throws IOException {char cb[] = new char[1];if (read(cb, 0, 1) == -1)return -1;elsereturn cb[0];}

3.1.4、Writer

    abstract public void write(char cbuf[], int off, int len) throws IOException;//將字符數組的一部分寫入到輸出流/*** 將指定字符寫入到輸出流*/public void write(int c) throws IOException {synchronized (lock) {if (writeBuffer == null){writeBuffer = new char[WRITE_BUFFER_SIZE];}writeBuffer[0] = (char) c;write(writeBuffer, 0, 1);}}/*** 將字符數組的所有內容寫入到輸出流*/public void write(char cbuf[]) throws IOException {write(cbuf, 0, cbuf.length);}/*** 將字符串的所有內容寫入到輸出流*/public void write(String str) throws IOException {write(str, 0, str.length());}/*** 將字符串的部分內容寫入到輸出流*/public void write(String str, int off, int len) throws IOException {synchronized (lock) {char cbuf[];if (len <= WRITE_BUFFER_SIZE) {if (writeBuffer == null) {writeBuffer = new char[WRITE_BUFFER_SIZE];}cbuf = writeBuffer;} else {    // Don't permanently allocate very large buffers.cbuf = new char[len];}str.getChars(off, (off + len), cbuf, 0);write(cbuf, 0, len);}}

3.2、NIO

對IO的概念有基本的了解之后,我們再來了解一下JAVA中類似的概念NIO。由于本文主要介紹IO的概念,所以對NIO的介紹會很淺顯,后面會有專門的文章來介紹NIO。

NIO( New Input/ Output)一種同步非阻塞的IO模型。同步是指線程不斷輪詢IO事件是否就緒,非阻塞是指線程在等待IO的時候,可以繼續其他任務。同步的核心是Selector,Selector替代了線程本身去輪詢IO事件,避免了阻塞的同時也減少了不必要的線程消耗;非阻塞的核心是通道和緩沖區,當IO事件就緒時,可以通過寫到緩沖區,保證IO的成功,而無需線程阻塞式的等待。

NIO和IO的主要區別

IONIO
面向流面向緩沖
阻塞IO非阻塞IO
選擇器

關于通道、緩沖區和選擇器的實現參考https://blog.csdn.net/forezp/article/details/88414741

參考:

  1. https://blog.csdn.net/qq_36962144/article/details/79815457
  2. https://www.cnblogs.com/ylspace/p/8128112.html
  3. https://www.cnblogs.com/fysola/p/6123947.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530410.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530410.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringMVC注解

一&#xff0c;RequestMapping 可以用在類和方法上 1.1 作用&#xff1a; 將客戶端請求映射到可匹配的類和方法中 1.2 屬性&#xff1a; name 給映射指定一個名字 path(同value相同&#xff09; 請求的url&#xff0c;path{"/mixedAttribute1","/mixedA…

【JAVA基礎篇】運算符

一、表達式 表達式由運算符和操作數組成 例如&#xff1a; 5 num1 num1num2 sumnum1num2 二、運算符分類 算數運算符、賦值運算符、關系運算符、邏輯運算符、條件運算符、位運算符 三、算數運算符 四、賦值運算符 格式&#xff1a;變量表達式 例如&#xff1a;int n3…

a4紙網頁打印 table_打印模板不愁人,你還在打印單調的A4紙嗎?

軟件介紹早在幾年前&#xff0c;社會上就已經開始了數字化、無紙化的推廣&#xff0c;但是就算再怎么無紙化&#xff0c;紙張還是有它必要的存在&#xff0c;在工作、學習過程中&#xff0c;打印的需求也必不可少的。但是一般的打印都是比較平庸的&#xff0c;要做會議記錄&…

IP地址、子網掩碼、網關、默認網關、DNS的理解

IP地址 Internet上為了區分數以億計的主機而給每個主機分配一個專門的地址&#xff0c;通過IP地址可以訪問到每臺主機。 子網掩碼 子網掩碼又稱網絡掩碼、地址掩碼、子網絡遮罩。它是用來指明一個IP地址哪些位標識的是主機所在的子網&#xff0c;以及哪些位標識的是主機的位…

上證指數30年k線圖_技術預判2020:上證指數要突破3500點才會“井噴”

2019年的行情很快就要收官了&#xff0c;截止目前&#xff0c;上證指數今年的漲幅是20.5%&#xff0c;不過可能有部分投資者今年的收益率還沒達到大盤指數的平均水平。不管怎樣&#xff0c;今年很快就要翻篇了&#xff0c;關鍵是看2020年股市能不能迎來更好的行情了。而總結得失…

【JAVA基礎篇】基本數據類型及自動類型轉換

一、8種基本數據類型以及占用內存空間大小 boolean 1byte或4byte byte 8bit/1byte char 16bit/2byte short 16bit/2byte float 32bit/4byte int 32bit/4byte long 64bit/8byte double 64bit/8byte 二、自動類型轉換 …

的優缺點_淺談桉木家具的優缺點

家具現在的材質是有很多的&#xff0c;木質的&#xff0c;石材的&#xff0c;還有真空充氣的&#xff0c;都是很不錯的類型。桉木家具是現在很多人都喜歡的一種材質&#xff0c;但是很多人對桉木家具的優缺點不是很清楚&#xff0c;為了能夠讓大家更加清楚的了解桉木家具&#…

【算法篇】遞歸

一、遞歸的概念 程序調用自身的編程技巧稱為遞歸。 遞歸的核心思想就是將一個大規模復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解。 二、遞歸的優點 使用遞歸的好處是只需要少量的代碼就可以描述出求解問題過程中多次重復的計算&#xff0c;大大減少了程序…

客戶說發貨慢怎么回復_女生微信說身體不舒服怎么回復關心她?

當你不在女生身邊&#xff0c;女生微信給你說身體不舒服&#xff0c;肯定需要說點話來安慰她了。多喝熱水肯定是不行了&#xff0c;一點用處都沒有&#xff0c;還會讓女生覺得你根本不重視她&#xff0c;是在敷衍她&#xff0c;那女生微信說身體不舒服怎么回復關心她呢&#xf…

【算法篇】八種內排序算法

常用的八種內排序算法分別是&#xff1a; 交換排序&#xff1a;冒泡排序、快速排序選擇排序&#xff1a;簡單選擇排序、堆排序插入排序&#xff1a;直接插入排序、希爾排序歸并排序基數排序 內排序巧記&#xff1a;選(選擇)艦(簡單選擇)隊(堆)的時候腳(交換)毛(冒泡)快(快速)&…

數據分析專題報告范文6篇_小學生看圖寫話范文:小熊玩蹺蹺板?(6篇),讓孩子參考練習...

?范文01&#xff1a;小熊蹺蹺板一天&#xff0c;天氣晴朗&#xff0c;胖乎乎的小熊和小白兔一起玩蹺蹺板。小熊一屁股坐在地上&#xff0c;小白兔說&#xff1a;“啊&#xff01;我有恐高癥哇&#xff01;”小熊說&#xff1a;“我比你重&#xff0c;所以你沒有辦法把我翹起來…

PL/SQL

1 PL/SQLPL/SQL:過程化SQL語言&#xff08;Procedural Language/SQL&#xff09;。PL/SQL是Oracle數據庫對SQL語句的擴展。在普通SQL語句的使用上增加了編程語言的特點&#xff0c;所以PL/SQL把數據操作和查詢語句組織在PL/SQL代碼的過程性單元中&#xff0c;通過邏輯判斷、循環…

20sccm_SCCM 2012安裝圖解教程(一步一步詳細步驟)

本系列文章的環境架構如下圖所示&#xff1a;所有服務器安裝的操作系統都是windows Server 2008 R2 中文企業版。計算機名軟件、版本及角色SC-DC.SC.COMwindows Server 2008 R2 Enterprise /Active Directory 2008 R2SC-SQL.SC.COMSQL Server 2008 R2 EnterpriseSC-SCCM.SC.COM…

【Java中級篇】Dom4j解析xml數據

一、依賴 <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency> 二、test.xml <?xml version"1.0" encoding"UTF-8"?> <students>…

redis 附近的人_使用redis—geo api實現搜索附近的人,自己寫的一個composer包

安裝如果是應用在項目當中的話找到根目錄&#xff0c;需要和 composer.json同級composer require gaopengfei/redis_lbs基本操作初始化require_once __DIR__./vendor/autoload.php;$lbs new \LBS\Services\LBSService();添加$add_params [[name > yabao_road,long > 11…

【Java中級篇】使用zxing生成二維碼

一、pom.xml添加依賴 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.zxing</groupId><artifa…

微信小程序彈出框豎向滾動_微信小程序 解決自定義彈出層滑動時下層頁面滾動問題...

WXML將整個底層頁面使用 scroll-view 包裹起來&#xff0c;設置 scroll-y 當顯示彈出層的時候為 true&#xff0c; 閉關彈出層的時候為 falseWXSSPage 設置為絕對定位&#xff0c;寬高各百分之百 &#xff0c; scroll-view 高度 百分之百Page{position: absolute;width: 100%;h…

win10環境安裝使用svn客戶端和服務端

一、下載安裝包 安裝包下載傳送門http://subversion.apache.org/packages.html 無法下載的童鞋去百度云下載 鏈接&#xff1a;https://pan.baidu.com/s/1EuGohoZKIPmRvynp5-Subw 提取碼&#xff1a;ohna 鏈接&#xff1a;https://pan.baidu.com/s/1EJrd5DzGCBE4rRfdhuno6Q …

openglshader實現虛擬場景_opengl – 如何使用GLSL著色器將徑向模糊應用于整個場景?...

我在GLSL中有一個徑向模糊著色器,它采用紋理,對其進行徑向模糊,并將結果呈現給屏幕.這個工作很好,到目前為止.問題在于,它將徑向模糊應用于場景中的第一個紋理.但是我實際上想做的就是將這個模糊應用于整個場景.實現此功能的最佳方式是什么&#xff1f;我可以只使用著色器,還是…

記一次尷尬的面試

昨天信達雅公司邀請我去平安面試&#xff0c;然后我今天10點到科技信息中心&#xff0c;等了接近20分鐘才有人過來接我。 第一個環節是機試 40個題目&#xff0c;主要是選擇題&#xff0c;花了40分鐘結束戰斗&#xff0c;總分100得了75分&#xff08;手機快沒電了&#xff0c…