成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

調(diào)用Java NIO提高文件讀寫速度

開發(fā) 后端
Java NIO的創(chuàng)建目的是為了讓Java程序員可以實現(xiàn)高速I/O而無需編寫自定義的本機代碼。Java NIO的高效得益于其兩大"助手":Channel和Buffer。NIO將最耗時的I/O操作(即填充和提取緩沖區(qū))轉(zhuǎn)移回操作系統(tǒng),因而可以極大地提高速度。

  Java NIO的出現(xiàn)旨在提高文件的讀寫速度,當然IO用NIO重新實過,所以我們不用顯示的調(diào)用NIO也能享受這種高效的文件讀寫。

  Java NIO的高效得益于其兩大"助手":Channel(管道)和Buffer(緩沖器)。當然這兩個"得力助手"的"年齡"遠遠比java大!力求簡單易懂的把知識講解給大家,我舉一個例子來說明一下這"兩元大將"是如何在java NIO中配合工作的。

  中國古代有一種傳統(tǒng)的吸煙器具---水煙袋。我想用這個東西來模擬一下Channel和Buffer的工作原理。不求說的好,力求準確無誤。

[[50129]]

分析一下水煙袋是如何工作的:

 

  ***步,準備工作,準備好上等煙絲;第二步,將"水斗"中裝入適量的水,煙倉中裝滿煙絲并插入水斗中,然后再將煙管插入水斗中;第三步,點燃煙絲并吸氣。香煙從煙倉產(chǎn)生,經(jīng)過水的過濾進入水上的空閑區(qū)。第四步,享受吸煙的快感.....從這個例子中我們提取出主要對象"煙",來分析一下它的運動軌跡。煙倉把煙生產(chǎn)出來,經(jīng)過水的過濾飄到水上面的空閑區(qū)域,然后通過煙管進入人的體內(nèi)。

  如果上面的過程大家理解了,明白了,那么java NIO你已經(jīng)了解了50%,至少你已經(jīng)知道它的工作原理了。因為用NIO處理的數(shù)據(jù)和用水煙袋中吸煙很相似。我們分析一下NIO的工作原理,非常簡單。

  當然和吸煙一樣我們首先必須有要用NIO來處理需求的欲望(這好比你想要吸煙了),比方說我想要將C盤下面的wk.txt文件進行備份,備份文件的名稱為wk-bak.txt。類比剛剛吸煙的那個過程:

  步驟一:準備工作,確定文件的位置,并將程序不可直接操作的文件轉(zhuǎn)換成字符流的形式(這一步和上邊吸煙實例的***步?jīng)]有什么差別,只是進行一些簡單的準備工作)。

  1. String inFile = "C:\\wk.txt";
  2. String outFile = "C:\\wk-bak.txt";
  3. FileInputStream inf = new FileInputStream(inFile);
  4. FileOutputStream outf = new FileOutputStream(outFile);
  5. ByteBuffer buffer = ByteBuffer.allocate(1024); 


  步驟二:創(chuàng)建文件輸入管道,和文件輸出管道。(這一步與上邊吸煙的第二部稍有差別,因為Channel和Buffer是在讀寫的時候才發(fā)生的"連接"動作)

  1. //準備文件讀取的管道-->相當于煙倉和煙管FileChannel inFc = inf.getChannel();  
  2. FileChannel outFc = outf.getChannel();  
  3. Charset charSet = Charset.forName("utf-8");  
  4. //進行編碼解碼-->相當于水斗中水的過濾作用  
  5. CharsetDecoder decoder = charSet.newDecoder();  
  6. CharsetEncoder encoder = charSet.newEncoder();   

  步驟三:開始進行文件備份工作。

  1.  while(true) {             
  2.  //準備向Buffer中寫入數(shù)據(jù)-->相當于點燃煙絲,完事具備只欠東風  
  3.        buffer.clear();                          
  4. //進行字符編碼 -->相當于水的過濾作用  
  5.        CharBuffer cb = decoder.decode(buffer);  
  6.        ByteBuffer bb = encoder.encode(cb);  
  7.                           
  8. //數(shù)據(jù)經(jīng)過編碼以后暫存緩沖區(qū)-->相當于經(jīng)過水過濾后的煙暫停在水斗中  
  9.             int t = inFc.read(bb);  
  10.             if(t == -1) {  
  11.                 break;  
  12.             }  
  13.                         bb.flip();  
  14.                         //將字節(jié)碼寫入目標文件-->相當于煙已經(jīng)進入到嘴里  
  15.             outFc.write(bb);  
  16.         } 

  步驟四:檢查文件是否備份成功。發(fā)現(xiàn)C盤下面多了一個wk-bak.txt的文件,內(nèi)容與wk.txt一摸一樣。接下來享受java帶給你的快感....

  上面的例子估計大家已經(jīng)理解的差不多了,當然如果深究也會有一些不太妥當?shù)牡胤剑遣灰^真,目的是學習NIO,并不是吸煙。如果感覺你可以了那么就請把上面的例子補充完整,運行一下,享受一下NIO的威武(當然字符編碼并不是必須的,只是讓這個例子顯得完整一點)。

#p#

  好吧如果你理解了上面的東西,并且真正的補全了文件備份的小程序,那么就來進行稍微深入一點的學習吧。

  上文我提到了舉吸煙的例子是有欠妥當?shù)模渲兄痪褪荁uffer的內(nèi)部機制和"水斗"簡單的過濾功能是不一樣的。還有字符編碼那一塊也不是在Buffer內(nèi)部實現(xiàn)的東西,decoder和encoder是針對Buffer的兩個工具。那我們接下來分析一下Buffer內(nèi)部機制到底不一樣在哪里呢(主要分析常用的兩個方法;clear(),flip())?

  來吧,打開Buffer的源碼(摘取有用的部分):

  1. public abstract class Buffer {  
  2.     // Invariants: mark <= position <= limit <= capacity  
  3.     private int mark = -1;  
  4.     private int position = 0;  
  5.     private int limit;  
  6.     private int capacity;  
  7.  public final Buffer clear() {  
  8.     position = 0;  
  9.     limit = capacity;  
  10.     mark = -1;  
  11.     return this;  
  12.     }  
  13.      public final Buffer flip() {  
  14.     limit = position;  
  15.     position = 0;  
  16.     mark = -1;  
  17.     return this;  
  18.     } 

 首先我們要明確一點,所謂的緩沖器僅僅是一個"多功能"的數(shù)組。可能在這個Buffer類中沒有體現(xiàn),但是如果我們打開ByteBuffer的源碼會有byte[]的數(shù)組,打開CharBuffer的源碼會有char[]的數(shù)組。因為Buffer是所有緩沖器的父類,所以他它不能預計會有多少種緩沖器,所以索性讓"兒子"們自己實現(xiàn)去吧。

  既然知道了緩沖器是一個"多功能的數(shù)組",那么我們用畫圖的形式來分析一下上面Buffer的源碼。

 

假設(shè)我們定義了一個8個單位大的緩沖區(qū),如上圖(其實Buffer也就是這么一個東西)。首先告訴大家那三個重要的關(guān)于緩沖區(qū)狀態(tài)的的屬性:

  capacity:緩沖區(qū)的容量;

  limit:緩沖區(qū)還有多少數(shù)據(jù)能夠取出或者緩沖區(qū)還有多少容量用于存放數(shù)據(jù);

  position:相當于一個游標(cursor),記錄我們從哪里開始寫數(shù)據(jù),從哪里開始讀數(shù)據(jù)。

剛還說到flip()和clear()是Buffer的兩個重要的方法,因為它們兩個方法決定了緩沖是否能正常的進行讀寫工作。

  當我們要想從緩沖區(qū)中寫數(shù)據(jù)的時候必須先執(zhí)行flip()方法,當我們要想從緩沖區(qū)中讀數(shù)據(jù)時必須先執(zhí)行clear()方法。

***次向Buffer中寫入數(shù)據(jù)時,執(zhí)行一次flip()方法以后,Buffer的結(jié)構(gòu)變成了這樣:position指向了***個可以存取數(shù)據(jù)的0號位,limit和capacity同時指向***位。

假如***次我們向Buffer中寫入了3單位的數(shù)據(jù),我們再次執(zhí)行flip()方法則Buffer的結(jié)構(gòu)會變成上圖的所示。但是經(jīng)過flip()的改造后position總是指向Buffer中***個可用的位置。那么,未執(zhí)行flip()方法以前position在哪里呢?很簡單,指向***一個數(shù)據(jù)的位置。

當我們想要從Buffer中讀取數(shù)據(jù)時,執(zhí)行clear()方法,Buffer的內(nèi)部結(jié)構(gòu)變成了上圖所示,position指向了可讀數(shù)據(jù)的首位,limit指向了原來position的位置。

  從上面的幾幅圖中我們看出:capacity代表了Buffer的容量是不變的,limit與position的差總是表示Buffer總可以讀的數(shù)據(jù),或者Buffer中可以寫數(shù)據(jù)的容量。還有position總是小于等于limit,limit總是小于等于capacity。

  其實到這里我們已經(jīng)發(fā)現(xiàn),NIO并不像IO那么復雜,因為IO 中的Decorator模式和Adaptor模式確實讓我們一時間摸不到頭腦,但是熟悉了會感覺到IO的設(shè)計之精美。

  NIO中還有一個知識點就是無阻塞的Socket編程,這里就不說了,因為比較復雜,但是如果我們真正理解了Selector這個調(diào)度者的工作,那么無阻塞的實現(xiàn)機制我們差不多就掌握了,復雜也就是編碼上面的事了。

原文鏈接:http://www.cnblogs.com/focusj/archive/2011/11/03/2231583.html

編輯推薦:

  1. 從過去5年編程語言的演化看未來趨勢
  2. 什么是JavaScript異步編程
  3. 多核平臺下的Java優(yōu)化
  4. 詳細介紹Java中的堆和棧
  5. 談java中類的加載、鏈接和初始化

 

責任編輯:林師授 來源: focusJ的博客
相關(guān)推薦

2023-08-03 07:30:01

JavaNIO庫

2021-02-26 20:55:56

JavaNIO隨機

2011-07-04 17:45:45

Qt Sqlite 數(shù)據(jù)庫

2022-02-14 15:07:48

進程FileChanne線程

2024-06-27 11:00:07

2016-09-07 15:02:03

ElasticSear索引速度

2024-03-11 15:47:11

RustPython代碼

2021-06-29 07:47:23

多線程協(xié)作數(shù)據(jù)

2009-12-31 16:18:44

Silverlight

2011-08-16 13:27:34

索引

2011-05-18 09:45:57

Rails

2011-08-15 18:20:05

建立索引SQL Sever數(shù)據(jù)

2011-05-30 13:15:05

PHP

2011-05-30 13:28:00

PHP

2013-05-27 10:58:10

propertiesJava語言

2010-05-21 17:27:33

IIS管理窗口

2024-05-27 00:03:00

Java數(shù)據(jù)JVM

2009-12-16 11:11:10

硬盤讀寫速度

2009-10-16 08:48:08

2022-04-27 09:24:22

前端代碼速度
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 在线看av网址| 99免费 | 中文字幕av一区 | 999国产精品视频免费 | 欧美天堂在线 | 黄色亚洲 | av在线免费看网址 | 久久国产精彩视频 | 中文字幕 在线观看 | 国产99精品| 日本成人在线观看网站 | 四虎影视一区二区 | 欧美一a一片一级一片 | 久久i | 黑人精品欧美一区二区蜜桃 | 久久久国产精品 | 九九久久精品 | 成人免费视频网站在线观看 | 日韩国产免费 | 日韩亚洲欧美一区 | 成人福利网 | 青春草91 | 成人福利在线观看 | 国产成人jvid在线播放 | 国产成人精品一区二 | 91九色麻豆| 亚av在线| 精品一区二区久久久久久久网站 | 免费观看的黄色网址 | 一区二区三区欧美在线 | 五月天激情综合网 | 精品一二三区在线观看 | 国精产品一品二品国精在线观看 | 99久久精品国产一区二区三区 | 91.com在线观看 | 国产成人精品一区二三区在线观看 | 992tv人人草 久久精品超碰 | 亚洲精品久久嫩草网站秘色 | 国产高清视频 | 亚洲综合无码一区二区 | 国产欧美在线视频 |