日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java NIO異步文件通道原理及用法解析

瀏覽:90日期:2022-08-25 17:53:39

在Java 7,AsynchronousFileChannel 被添加到了Java NIO中。使用AsynchronousFileChannel可以實(shí)現(xiàn)異步地讀取和寫入文件數(shù)據(jù)。

創(chuàng)建一個(gè)AsynchronousFileChannel

我們可以使用AsynchronousFileChannel提供的靜態(tài)方法 open() 創(chuàng)建它。示例代碼如下:

Path path = Paths.get('data/test.xml');AsynchronousFileChannel fileChannel =AsynchronousFileChannel.open(path, StandardOpenOption.READ);

第一個(gè)參數(shù)是一個(gè) PATH 的對(duì)像實(shí)例,它指向了那個(gè)與 AsynchronousFileChannel 相關(guān)聯(lián)的文件。

第二個(gè)參數(shù)是一個(gè)或多個(gè)操作選項(xiàng),它決定了 AsynchronousFileChannel 將對(duì)目標(biāo)文件做何種操作。示例代碼中我們使用了 StandardOpenOption.READ ,它表明我們將要對(duì)目標(biāo)文件進(jìn)行讀操作。

讀取數(shù)據(jù)

AsynchronousFileChannel 提供了兩種讀取數(shù)據(jù)的方式,都是調(diào)用它本身的 read() 方法。下面將對(duì)兩種方式進(jìn)行介紹。

使用Futrue讀取數(shù)據(jù)

第一種反式是調(diào)用 AsynchronousFileChannel 的 read() 方法,該方法反回一個(gè) Future 類型的對(duì)象。

Future operation = fileChannelread(buffer, 0);

第一個(gè)參數(shù)是ByteBuffer,從 AsynchronousFileChannel 中讀取的數(shù)據(jù)先寫入這個(gè) ByteBuffer 。

第二個(gè)參數(shù)表示從文件讀取數(shù)據(jù)的開始位置。

此 read() 方法會(huì)立即返回,即使整個(gè)讀的過程還沒有完全結(jié)束。我們可以通過operation.isDone()來檢查讀取是否完成。這里的 operation 是上面調(diào)用 read() 方法返回的 Future 類型的實(shí)例。下面是一段詳細(xì)的代碼示例:

AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);ByteBuffer buffer = ByteBuffer.allocate(1024);long position = 0;Future<Integer> operation = fileChannel.read(buffer, position);while(!operation.isDone());buffer.flip();byte[] data = new byte[buffer.limit()];buffer.get(data);System.out.println(new String(data));buffer.clear();

上面的程序首先創(chuàng)建了一個(gè) AsynchronousFileChannel 對(duì)象,然后調(diào)用它的read()方法返回一個(gè)Future。其中read()方法需要兩個(gè)參數(shù),一個(gè)是ByteBuffer,另一個(gè)是讀取文件的開始位置。然后通過循環(huán)調(diào)用isDone() 方法檢測(cè)讀取過程是否完成,完成后 isDone()方法將返回true。盡管這樣讓cpu空轉(zhuǎn)了一會(huì),但是我們還是應(yīng)該等讀取操作完成后再進(jìn)行后續(xù)的步驟。

一旦讀取完成,數(shù)據(jù)被存儲(chǔ)到ByteBuffer,然后將數(shù)據(jù)轉(zhuǎn)化為字符串既而輸出。

使用CompletionHandler讀取數(shù)據(jù)

第二種讀取數(shù)據(jù)的方式是調(diào)用AsynchronousFileChannel 的另一個(gè)重載 read() 方法,改方法需要一個(gè)CompletionHandler 作為參數(shù)。下面是代碼示例:

fileChannel.read(buffer, position, buffer, new CompletionHandler<Integer, ByteBuffer>() { @Override public void completed(Integer result, ByteBuffer attachment) { System.out.println('result = ' + result); attachment.flip(); byte[] data = new byte[attachment.limit()]; attachment.get(data); System.out.println(new String(data)); attachment.clear(); } @Override public void failed(Throwable exc, ByteBuffer attachment) { }});

一旦讀取操作完成,CompletionHandler的 complete() 方法將會(huì)被調(diào)用。它的第一個(gè)參數(shù)是個(gè) Integer類型,表示讀取的字節(jié)數(shù)。第二個(gè)參數(shù) attachment 是 ByteBuffer 類型的,用來存儲(chǔ)讀取的數(shù)據(jù)。它其實(shí)就是由 read() 方法的第三個(gè)參數(shù)。當(dāng)前示例中,我們選用 ByteBuffer 來存儲(chǔ)數(shù)據(jù),其實(shí)我們也可以選用其他的類型。

讀取失敗的時(shí)候,CompletionHandler的 failed()方法會(huì)被調(diào)用。

寫入數(shù)據(jù)

就像讀取一樣,我們同樣有兩種方式向 AsynchronousFileChannel 寫入數(shù)據(jù)。我們可以調(diào)用它的2個(gè)重載的 write() 方法。下面我們將分別加以介紹。

使用Future讀取數(shù)據(jù)

AsynchronousFileChannel也可以異步寫入數(shù)據(jù)。下面是一個(gè)完整的寫入示例:

AsynchronousFileChannel也可以異步寫入數(shù)據(jù)。下面是一個(gè)完整的寫入示例:Path path = Paths.get('data/test-write.txt');AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE);ByteBuffer buffer = ByteBuffer.allocate(1024);long position = 0;buffer.put('test data'.getBytes());buffer.flip();Future<Integer> operation = fileChannel.write(buffer, position);buffer.clear();while(!operation.isDone());System.out.println('Write done');

首先實(shí)例化一個(gè)寫入模式的 AsynchronousFileChannel, 然后創(chuàng)建一個(gè) ByteBuffer 并寫入一些數(shù)據(jù)。再然后將數(shù)據(jù)寫入文件。最后,檢查返回的 Future,看是否寫入完成。

注意,寫入目標(biāo)文件要提前創(chuàng)建好,如果它不存在的話,writh() 方法會(huì)拋出一個(gè) java.nio.file.NoSuchFileException。

我們可以用以下方式來解決這一問題:

if(!Files.exists(path)){Files.createFile(path);}

使用CompletionHandler寫入數(shù)據(jù)

我們也可以使用 CompletionHandler代替Future向AsynchronousFileChannel寫入數(shù)據(jù),這種方式可以更加直接的知道寫入過程是否完成。下面是示例程序:

Path path = Paths.get('data/test-write.txt');if(!Files.exists(path)){ Files.createFile(path);}AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE);ByteBuffer buffer = ByteBuffer.allocate(1024);long position = 0;buffer.put('test data'.getBytes());buffer.flip();fileChannel.write(buffer, position, buffer, new CompletionHandler<Integer, ByteBuffer>() { @Override public void completed(Integer result, ByteBuffer attachment) { System.out.println('bytes written: ' + result); } @Override public void failed(Throwable exc, ByteBuffer attachment) { System.out.println('Write failed'); exc.printStackTrace(); }});

當(dāng)寫入程序完成時(shí),CompletionHandler的completed()方法將會(huì)被調(diào)用,相反的如果寫入失敗則會(huì)調(diào)用failed()方法。

要留意CompletionHandler的方法的參數(shù) attachemnt是怎么使用的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷综合六月| 日韩在线网址| 日韩精品亚洲专区| 欧美日中文字幕| 麻豆国产精品一区二区三区| 视频一区二区三区在线| 精品国产麻豆| 国产亚洲高清一区| 亚洲最大av| 国产亚洲高清视频| 亚洲精品a级片| 久久美女性网| 欧美日韩精品免费观看视完整 | 亚洲网站视频| 99在线精品免费视频九九视| 中文字幕色婷婷在线视频| 欧美日韩一区二区三区在线电影| 国产精品亚洲欧美| 美女日韩在线中文字幕| 激情丁香综合| 欧美高清不卡| 国产一区日韩一区| 欧洲一区二区三区精品| 国内自拍视频一区二区三区| 久久的色偷偷| 麻豆成人91精品二区三区| 国产欧美日韩在线观看视频| 欧美精品国产一区| 国产精品密蕾丝视频下载| 国产精品22p| 久久香蕉网站| 久久久久久夜| 免费福利视频一区二区三区| 麻豆91精品视频| 国产精品videossex久久发布| 国产专区精品| 美女久久精品| 日本欧美国产| 蜜桃成人精品| 欧美日韩国产免费观看| 美女久久网站| 日本v片在线高清不卡在线观看| 麻豆一区二区在线| 国产精品麻豆成人av电影艾秋| 91精品蜜臀一区二区三区在线| 香蕉久久久久久久av网站| 精品一区二区三区在线观看视频 | 少妇精品久久久一区二区三区| 少妇精品在线| 亚洲香蕉久久| 日韩精品第二页| 国产精品久久久久毛片大屁完整版| 欧美91福利在线观看| 美女久久久久| 另类av一区二区| 日韩三级精品| 久草精品视频| 国内精品99| 天堂精品久久久久| 久久国产精品免费一区二区三区| 久久久9色精品国产一区二区三区| 在线视频精品| 亚洲综合精品| 国产日韩一区二区三区在线播放| 亚洲一级特黄| 欧美中文日韩| 国产亚洲观看| 欧洲亚洲一区二区三区| 最新国产拍偷乱拍精品| 亚洲精品护士| 精品一区av| 一区二区视频欧美| 国产精品片aa在线观看| 日韩在线精品| 蜜桃免费网站一区二区三区| 国产精品白浆| 99久久亚洲精品| 亚洲三级网址| 久久99精品久久久野外观看| 亚洲欧美一区在线| 欧美一级全黄| 私拍精品福利视频在线一区| 亚洲精品在线二区| 亚洲一区二区网站| 亚洲欧美久久精品| 精品日韩一区| 久久成人亚洲| 国产成人精品免费视| 国产午夜精品一区二区三区欧美| 久久久久欧美精品| 免费在线观看日韩欧美| 国产精品三级| 国产在线日韩| 久久97视频| 亚州av乱码久久精品蜜桃| 日本欧美在线| 99精品小视频| 欧美极品中文字幕| 蜜桃久久av| 色偷偷色偷偷色偷偷在线视频| www.com.cn成人| 丝袜国产日韩另类美女| 捆绑调教美女网站视频一区| 国产精品7m凸凹视频分类| 日韩av成人高清| 99久精品视频在线观看视频| 国产亚洲一卡2卡3卡4卡新区| 911精品国产| 99精品在线| 欧美黄色精品| 日本在线视频一区二区| 欧美a级片一区| 成人在线免费观看91| 亚洲三级av| 欧美中文字幕一区二区| 精品无人区麻豆乱码久久久 | caoporn视频在线| 综合色就爱涩涩涩综合婷婷| 久久精品中文| 福利一区和二区| 国产欧美日韩一区二区三区四区| 国产精品欧美三级在线观看 | 国产精品日本一区二区三区在线 | 亚洲丝袜美腿一区| 日产精品一区| 四虎8848精品成人免费网站| 欧美久久久网站| 蜜乳av另类精品一区二区| 桃色av一区二区| 成人午夜在线| 久久精品国产999大香线蕉| 亚洲毛片在线免费| 女同性一区二区三区人了人一| 视频一区二区欧美| 亚洲综合在线电影| 国产精品久久久久久久久久10秀| 国产在线观看www| 日韩一区二区三免费高清在线观看| 久久黄色影视| 久久国产高清| 欧美日韩国产综合网| 色婷婷综合网| 国产日韩欧美| 久久高清免费观看| 99riav1国产精品视频| 亚洲精品国产嫩草在线观看| 久久毛片亚洲| 国产精品专区免费| 91亚洲国产| 日韩大片在线| 久久久久久久久成人| 青青青国产精品| 日韩国产欧美视频| 日韩视频1区| 欧美日韩一区二区三区四区在线观看 | а√天堂8资源中文在线| 欧美一区二区三区免费看| 中文字幕日韩高清在线 | 综合激情视频| 亚洲欧美日韩专区| 蜜臀精品一区二区三区在线观看| 日韩av一二三| 日本在线成人| 日韩精选在线| 欧美日韩1区| 乱一区二区av| 91欧美在线| 九九综合在线| 99国产精品免费视频观看| 国模 一区 二区 三区| 制服诱惑一区二区| 日产欧产美韩系列久久99| 国产欧美69| 高清久久一区| 亲子伦视频一区二区三区| 国模 一区 二区 三区| 免费视频久久| 青草综合视频| 久久久国产精品网站| 不卡专区在线| 日韩中文字幕亚洲一区二区va在线| 色爱综合网欧美| 黄色亚洲免费| 久久久免费人体| 亚洲综合欧美| 成人精品国产亚洲| 亚州精品视频| 亚洲风情在线资源| 日韩欧美中文字幕电影| 欧美gv在线| 日韩成人一级| 国内精品福利| 久久香蕉网站| 亚洲欧美日本国产| 欧美日韩一区二区综合 | 亚洲欧美一区在线| 国产一级成人av| 99久久九九| 久久av中文| 亚洲精品美女91|