亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

關(guān)于JAVA中順序IO的基本操作

EscapedDog / 3593人閱讀

摘要:關(guān)于中順序的基本操作關(guān)于中順序的基本操作寫在前面最近研究一下中的順序,在網(wǎng)絡(luò)上找了一會(huì)兒,發(fā)現(xiàn)少有詳細(xì)的介紹,顧此在此處說(shuō)說(shuō)順序,才學(xué)疏淺,如有不對(duì),望賜教。上述代碼中標(biāo)記位置中,返回下一次操作時(shí)的位置。

關(guān)于JAVA中順序IO的基本操作


寫在前面

最近研究一下JAVA中的順序IO,在網(wǎng)絡(luò)上找了一會(huì)兒,發(fā)現(xiàn)少有詳細(xì)的介紹,顧此在此處說(shuō)說(shuō)順序IO,才學(xué)疏淺,如有不對(duì),望賜教。

什么是順序IO

事實(shí)上JAVA具有很多操作文件的方案(方法), 許多程序需要將一些事件記錄到本地存儲(chǔ)中,常見的如數(shù)據(jù)庫(kù),MQ等,首先文件是許多帶數(shù)據(jù)的塊組成的,傳統(tǒng)IO操作文件具有一個(gè)尋址過(guò)程(事實(shí)上硬件上也會(huì)存在尋道,旋轉(zhuǎn)延遲等因素),小文件尚可,大文件就比較消耗性能和時(shí)間,比如數(shù)據(jù)庫(kù)分配的文件(本地),順序IO具備指定位置的功能,但是任然需要我們維護(hù)一個(gè)偏移量(游標(biāo)).

MappedByteBuffer

JAVA順序IO通過(guò)MappedByteBuffer實(shí)現(xiàn),與傳統(tǒng)IO不同的是,MappedByteBuffer需要使用者提供一個(gè)位置(偏移量),詳細(xì)看以下代碼:

mappedByteBuffer.position(index);mappedByteBuffer.put(content.getBytes(StandardCharsets.UTF_8));

代碼中可見,通過(guò)MappedByteBuffer提供的api position();來(lái)指定位置(偏移量),put()進(jìn)行寫操作,詳細(xì)如下。

寫操作

先看代碼:

public int write(File file ,String content ,int index,long size){RandomAccessFile randomAccessFile;MappedByteBuffer mappedByteBuffer;try {randomAccessFile = new RandomAccessFile(file,"rw"); //1FileChannel fileChannel = randomAccessFile.getChannel(); //2mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE,0,size); //3mappedByteBuffer.position(index); //4mappedByteBuffer.put(content.getBytes(StandardCharsets.UTF_8)); //5return mappedByteBuffer.position(); //6}catch (Exception e){e.printStackTrace();}return 0;}
  • 上述代碼中標(biāo)注1位置中使用RandomAccessFile (隨機(jī)流)來(lái)打開文件,此流與傳統(tǒng)IO除了兼并讀寫之外,在一些底層實(shí)現(xiàn)方式上也均有不同,在此不多做介紹,感興趣可另尋資料,在此需記住,此處使用隨機(jī)流的作用為第二步做準(zhǔn)備,且唯一,其中參數(shù)1為File對(duì)象,構(gòu)造方法重載的參數(shù)1可為文件路徑,參數(shù)2的取值可有4種,如下(取至JAVA官方文檔):
  1. "r"僅供閱讀。調(diào)用結(jié)果對(duì)象的任何寫方法都會(huì)引發(fā)IOException。(Open for reading only. Invoking any of the write methods of the resulting object will cause an IOException to be thrown. )

  2. "rw"開放閱讀和寫作。如果該文件不存在,那么將嘗試創(chuàng)建它。(Open for reading and writing. If the file does not already exist then an attempt will be made to create it. )

  3. “rws”和“rw”一樣,對(duì)文件內(nèi)容或元數(shù)據(jù)的每次更新都要同步寫入底層存儲(chǔ)設(shè)備。(Open for reading and writing, as with "rw", and also require that every update to the file"s content or metadata be written synchronously to the underlying storage device. )

  4. “rwd”和“rw”一樣,都是打開的,可以讀寫,并且還要求對(duì)文件內(nèi)容的每次更新都要同步寫入底層存儲(chǔ)設(shè)備。(Open for reading and writing, as with "rw", and also require that every update to the file"s content be written synchronously to the underlying storage device. )

  • 上述代碼中標(biāo)注2位置中,通過(guò)隨機(jī)流獲取到一個(gè)讀寫兼并的通道,實(shí)際上獲取IO通道的方式并不僅僅只有此種方式,但是在此處需要注意的是,順序讀寫所需的通道需兼并讀寫(第一步中參數(shù)2取值需為:rw,rws,rwd),如果不是,則會(huì)觸發(fā)IO異常,除此之外,上述提到過(guò)使用其他方式也可以獲取到文件IO通道,比如:
FileInputStream fileInputStream = new FileInputStream(file);FileChannel fileChannel = fileInputStream.getChannel();

運(yùn)行結(jié)果,標(biāo)記3處拋出異常:NonWritableChannelException
或者:

FileOutputStream fileInputStream = new FileOutputStream(file);FileChannel fileChannel = fileInputStream.getChannel();

運(yùn)行結(jié)果,標(biāo)記3處拋出異常:NonReadableChannelException
從上可以看到,不管是FileInputStream還是FileOutputStream獲取到的IO通道,均有局限性,不適用MappedByteBuffer。

  • 上述代碼中標(biāo)記3位置中,通過(guò)IO通道將該文件的內(nèi)容(或某個(gè)區(qū)域)直接映射到內(nèi)存中,并且對(duì)該內(nèi)存做的修改直接會(huì)傳播到文件(除了PRIVATE模式,后續(xù)介紹),通過(guò)FileChannel對(duì)象的map();api進(jìn)行映射,參數(shù)一指定映射方式,有如下三種(取至JAVA官方文檔):
  1. 只讀:任何修改結(jié)果緩沖區(qū)的嘗試都將導(dǎo)致拋出ReadOnlyBufferException。(MapMode.READ_ONLY) (Read-only: Any attempt to modify the resulting buffer will cause a ReadOnlyBufferException to be thrown. (MapMode.READ_ONLY) )

  2. 讀/寫:對(duì)產(chǎn)生的緩沖區(qū)所做的更改最終將傳播到文件;它們可能對(duì)映射了相同文件的其他程序可見,也可能不可見。(MapMode.READ_WRITE) (Read/write: Changes made to the resulting buffer will eventually be propagated to the file; they may or may not be made visible to other programs that have mapped the same file. (MapMode.READ_WRITE) )

  3. Private:對(duì)產(chǎn)生的緩沖區(qū)所做的更改不會(huì)傳播到該文件中,并且不會(huì)對(duì)映射了該文件的其他程序可見;相反,它們將導(dǎo)致創(chuàng)建緩沖區(qū)修改部分的私有副本。(MapMode.PRIVATE) (Private: Changes made to the resulting buffer will not be propagated to the file and will not be visible to other programs that have mapped the same file; instead, they will cause private copies of the modified portions of the buffer to be created. (MapMode.PRIVATE) )

參數(shù)二代表從指定位置開始映射,0表示從頭開始映射全部?jī)?nèi)容,參數(shù)三表示要映射的區(qū)域大小,可超出文件大小(如字符長(zhǎng)度為3,此處可填寫6或者其他),但不可為負(fù)數(shù)或超出Integer.MAX_VALUE.
實(shí)際上到此處,IO通道已經(jīng)完成了它的任務(wù),可關(guān)閉。(在標(biāo)記3之后任意位置可執(zhí)行fileChannel.close()而不影響運(yùn)行結(jié)果)
此處簡(jiǎn)要說(shuō)明了個(gè)參數(shù)的意思,要加深了解建議自己建立Demo并更改此處參數(shù)觀察運(yùn)行結(jié)果。

  • 上述代碼中標(biāo)記4位置中,通過(guò)MappedByteBuffer對(duì)象的position(); API設(shè)置寫入位置,官方解釋如下:
    Sets this buffer"s limit. If the position is larger than the new limit then it is set to the new limit. If the mark is defined and larger than the new limit then it is discarded.

  • 上述代碼中標(biāo)記5位置中,將內(nèi)容傳輸?shù)骄彌_區(qū),可理解為寫入,因?yàn)榫彌_區(qū)的變動(dòng)會(huì)傳播到實(shí)際文件中,除了PRIVATE。

  • 上述代碼中標(biāo)記6位置中,返回下一次操作時(shí)的位置。

此篇文章簡(jiǎn)要說(shuō)明了一下JAVA順序IO,有些地方?jīng)]有詳細(xì)說(shuō)明,會(huì)持續(xù)維護(hù)更新此篇文章,感謝大家。

?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/124129.html

相關(guān)文章

  • 關(guān)于Java IO與NIO知識(shí)都在這里

    摘要:從通道進(jìn)行數(shù)據(jù)寫入創(chuàng)建一個(gè)緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。三之通道主要內(nèi)容通道介紹通常來(lái)說(shuō)中的所有都是從通道開始的。從中選擇選擇器維護(hù)注冊(cè)過(guò)的通道的集合,并且這種注冊(cè)關(guān)系都被封裝在當(dāng)中停止選擇的方法方法和方法。 由于內(nèi)容比較多,我下面放的一部分是我更新在我的微信公眾號(hào)上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內(nèi)容給列出來(lái)了,便于大家學(xué)習(xí)與回顧。 Ja...

    Riddler 評(píng)論0 收藏0
  • Java進(jìn)階之路

    摘要:探索專為而設(shè)計(jì)的將探討進(jìn)行了何種改進(jìn),以及這些改進(jìn)背后的原因。關(guān)于最友好的文章進(jìn)階前言之前就寫過(guò)一篇關(guān)于最友好的文章反響很不錯(cuò),由于那篇文章的定位就是簡(jiǎn)單友好,因此盡可能的摒棄復(fù)雜的概念,只抓住關(guān)鍵的東西來(lái)講,以保證大家都能看懂。 周月切換日歷 一個(gè)可以進(jìn)行周月切換的日歷,左右滑動(dòng)的切換月份,上下滑動(dòng)可以進(jìn)行周,月不同的視圖切換,可以進(jìn)行事件的標(biāo)記,以及節(jié)假日的顯示,功能豐富 Andr...

    sushi 評(píng)論0 收藏0
  • Java NIO淺析

    摘要:阻塞請(qǐng)求結(jié)果返回之前,當(dāng)前線程被掛起。也就是說(shuō)在異步中,不會(huì)對(duì)用戶線程產(chǎn)生任何阻塞。當(dāng)前線程在拿到此次請(qǐng)求結(jié)果的過(guò)程中,可以做其它事情。事實(shí)上,可以只用一個(gè)線程處理所有的通道。 準(zhǔn)備知識(shí) 同步、異步、阻塞、非阻塞 同步和異步說(shuō)的是服務(wù)端消息的通知機(jī)制,阻塞和非阻塞說(shuō)的是客戶端線程的狀態(tài)。已客戶端一次網(wǎng)絡(luò)請(qǐng)求為例做簡(jiǎn)單說(shuō)明: 同步同步是指一次請(qǐng)求沒有得到結(jié)果之前就不返回。 異步請(qǐng)求不會(huì)...

    yeooo 評(píng)論0 收藏0
  • Java NIO 之 Channel(通道)

    摘要:通道可以異步讀寫。使用的方法讀取數(shù)據(jù)創(chuàng)建一個(gè)讀數(shù)據(jù)緩沖區(qū)對(duì)象從通道中讀取數(shù)據(jù)使用的方法寫入數(shù)據(jù)創(chuàng)建一個(gè)寫數(shù)據(jù)緩沖區(qū)對(duì)象寫入數(shù)據(jù)關(guān)閉完成使用后,您必須關(guān)閉它。五提供了一種被稱為的新功能,也稱為本地矢量。功能是通道提供的并不是。 歷史回顧: Java NIO 概覽 Java NIO 之 Buffer(緩沖區(qū)) 其他高贊文章: 面試中關(guān)于Redis的問(wèn)題看這篇就夠了 一文輕松搞懂redis集...

    piglei 評(píng)論0 收藏0
  • 高薪程序員&面試題精講系列22之說(shuō)說(shuō)JavaIO流,常用哪些IO流?

    摘要:一面試題及剖析今日面試題今天壹哥帶各位復(fù)習(xí)一塊可能會(huì)令初學(xué)者比較頭疼的內(nèi)容,起碼當(dāng)時(shí)讓我很有些頭疼的內(nèi)容,那就是流。在這里壹哥會(huì)從兩部分展開介紹流,即與流。除此之外盡量使用字節(jié)流。關(guān)閉此輸入流并釋放與流相關(guān)聯(lián)的任何系統(tǒng)資源。 一. 面試題及剖析 1. 今日面試題 今天 壹哥 帶各位復(fù)習(xí)一塊可...

    fnngj 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<