摘要:關于中順序的基本操作關于中順序的基本操作寫在前面最近研究一下中的順序,在網絡上找了一會兒,發現少有詳細的介紹,顧此在此處說說順序,才學疏淺,如有不對,望賜教。上述代碼中標記位置中,返回下一次操作時的位置。
寫在前面
最近研究一下JAVA中的順序IO,在網絡上找了一會兒,發現少有詳細的介紹,顧此在此處說說順序IO,才學疏淺,如有不對,望賜教。
什么是順序IO
事實上JAVA具有很多操作文件的方案(方法), 許多程序需要將一些事件記錄到本地存儲中,常見的如數據庫,MQ等,首先文件是許多帶數據的塊組成的,傳統IO操作文件具有一個尋址過程(事實上硬件上也會存在尋道,旋轉延遲等因素),小文件尚可,大文件就比較消耗性能和時間,比如數據庫分配的文件(本地),順序IO具備指定位置的功能,但是任然需要我們維護一個偏移量(游標).
MappedByteBuffer
JAVA順序IO通過MappedByteBuffer實現,與傳統IO不同的是,MappedByteBuffer需要使用者提供一個位置(偏移量),詳細看以下代碼:
mappedByteBuffer.position(index);mappedByteBuffer.put(content.getBytes(StandardCharsets.UTF_8));
代碼中可見,通過MappedByteBuffer提供的api position();來指定位置(偏移量),put()進行寫操作,詳細如下。
寫操作
先看代碼:
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;}
"r"僅供閱讀。調用結果對象的任何寫方法都會引發IOException。(Open for reading only. Invoking any of the write methods of the resulting object will cause an IOException to be thrown. )
"rw"開放閱讀和寫作。如果該文件不存在,那么將嘗試創建它。(Open for reading and writing. If the file does not already exist then an attempt will be made to create it. )
“rws”和“rw”一樣,對文件內容或元數據的每次更新都要同步寫入底層存儲設備。(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. )
“rwd”和“rw”一樣,都是打開的,可以讀寫,并且還要求對文件內容的每次更新都要同步寫入底層存儲設備。(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. )
FileInputStream fileInputStream = new FileInputStream(file);FileChannel fileChannel = fileInputStream.getChannel();
運行結果,標記3處拋出異常:NonWritableChannelException
或者:
FileOutputStream fileInputStream = new FileOutputStream(file);FileChannel fileChannel = fileInputStream.getChannel();
運行結果,標記3處拋出異常:NonReadableChannelException
從上可以看到,不管是FileInputStream還是FileOutputStream獲取到的IO通道,均有局限性,不適用MappedByteBuffer。
只讀:任何修改結果緩沖區的嘗試都將導致拋出ReadOnlyBufferException。(MapMode.READ_ONLY) (Read-only: Any attempt to modify the resulting buffer will cause a ReadOnlyBufferException to be thrown. (MapMode.READ_ONLY) )
讀/寫:對產生的緩沖區所做的更改最終將傳播到文件;它們可能對映射了相同文件的其他程序可見,也可能不可見。(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) )
Private:對產生的緩沖區所做的更改不會傳播到該文件中,并且不會對映射了該文件的其他程序可見;相反,它們將導致創建緩沖區修改部分的私有副本。(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) )
參數二代表從指定位置開始映射,0表示從頭開始映射全部內容,參數三表示要映射的區域大小,可超出文件大小(如字符長度為3,此處可填寫6或者其他),但不可為負數或超出Integer.MAX_VALUE.
實際上到此處,IO通道已經完成了它的任務,可關閉。(在標記3之后任意位置可執行fileChannel.close()而不影響運行結果)
此處簡要說明了個參數的意思,要加深了解建議自己建立Demo并更改此處參數觀察運行結果。
上述代碼中標記4位置中,通過MappedByteBuffer對象的position(); API設置寫入位置,官方解釋如下:
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.
上述代碼中標記5位置中,將內容傳輸到緩沖區,可理解為寫入,因為緩沖區的變動會傳播到實際文件中,除了PRIVATE。
上述代碼中標記6位置中,返回下一次操作時的位置。
此篇文章簡要說明了一下JAVA順序IO,有些地方沒有詳細說明,會持續維護更新此篇文章,感謝大家。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124129.html
摘要:從通道進行數據寫入創建一個緩沖區,填充數據,并要求通道寫入數據。三之通道主要內容通道介紹通常來說中的所有都是從通道開始的。從中選擇選擇器維護注冊過的通道的集合,并且這種注冊關系都被封裝在當中停止選擇的方法方法和方法。 由于內容比較多,我下面放的一部分是我更新在我的微信公眾號上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內容給列出來了,便于大家學習與回顧。 Ja...
摘要:阻塞請求結果返回之前,當前線程被掛起。也就是說在異步中,不會對用戶線程產生任何阻塞。當前線程在拿到此次請求結果的過程中,可以做其它事情。事實上,可以只用一個線程處理所有的通道。 準備知識 同步、異步、阻塞、非阻塞 同步和異步說的是服務端消息的通知機制,阻塞和非阻塞說的是客戶端線程的狀態。已客戶端一次網絡請求為例做簡單說明: 同步同步是指一次請求沒有得到結果之前就不返回。 異步請求不會...
摘要:通道可以異步讀寫。使用的方法讀取數據創建一個讀數據緩沖區對象從通道中讀取數據使用的方法寫入數據創建一個寫數據緩沖區對象寫入數據關閉完成使用后,您必須關閉它。五提供了一種被稱為的新功能,也稱為本地矢量。功能是通道提供的并不是。 歷史回顧: Java NIO 概覽 Java NIO 之 Buffer(緩沖區) 其他高贊文章: 面試中關于Redis的問題看這篇就夠了 一文輕松搞懂redis集...
摘要:一面試題及剖析今日面試題今天壹哥帶各位復習一塊可能會令初學者比較頭疼的內容,起碼當時讓我很有些頭疼的內容,那就是流。在這里壹哥會從兩部分展開介紹流,即與流。除此之外盡量使用字節流。關閉此輸入流并釋放與流相關聯的任何系統資源。 一. 面試題及剖析 1. 今日面試題 今天 壹哥 帶各位復習一塊可...
閱讀 983·2021-11-23 09:51
閱讀 3470·2021-11-22 12:04
閱讀 2715·2021-11-11 16:55
閱讀 2919·2019-08-30 15:55
閱讀 3221·2019-08-29 14:22
閱讀 3350·2019-08-28 18:06
閱讀 1240·2019-08-26 18:36
閱讀 2126·2019-08-26 12:08