中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行Java NIO中緩沖區的分析

發布時間:2021-12-03 17:32:38 來源:億速云 閱讀:101 作者:柒染 欄目:云計算

本篇文章為大家展示了如何進行Java NIO中緩沖區的分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

對于NIO中緩沖區來說,還有很多的內容值的學習,如緩沖區的分片與數據共享,只讀緩沖區等。下面我們來看一下緩沖區一些更細節的內容。

緩沖區的分配

在前面的幾個例子中,我們已經看過了,在創建一個緩沖區對象時,會調用靜態方法allocate()來指定緩沖區的容量,其實調用 allocate()相當于創建了一個指定大小的數組,并把它包裝為緩沖區對象。或者我們也可以直接將一個現有的數組,包裝為緩沖區對象,如下示例代碼所示:

[java] view plain copy

 print?

  1. public class BufferWrap {  

  2.   

  3.     public void myMethod()  

  4.     {  

  5.         // 分配指定大小的緩沖區  

  6.         ByteBuffer buffer1 = ByteBuffer.allocate(10);  

  7.           

  8.         // 包裝一個現有的數組  

  9.         byte array[] = new byte[10];  

  10.         ByteBuffer buffer2 = ByteBuffer.wrap( array );  

  11.     }  

  12. }  

緩沖區分片

在NIO中,除了可以分配或者包裝一個緩沖區對象外,還可以根據現有的緩沖區對象來創建一個子緩沖區,即在現有緩沖區上切出一片來作為一個新的緩沖區,但現有的緩沖區與創建的子緩沖區在底層數組層面上是數據共享的,也就是說,子緩沖區相當于是現有緩沖區的一個視圖窗口。調用slice()方法可以創建一個子緩沖區,讓我們通過例子來看一下:

[java] view plain copy

 print?

  1. import java.nio.*;  

  2.   

  3. public class Program {  

  4.     static public void main( String args[] ) throws Exception {  

  5.         ByteBuffer buffer = ByteBuffer.allocate( 10 );  

  6.           

  7.         // 緩沖區中的數據0-9  

  8.         for (int i=0; i<buffer.capacity(); ++i) {  

  9.             buffer.put( (byte)i );  

  10.         }  

  11.           

  12.         // 創建子緩沖區  

  13.         buffer.position( 3 );  

  14.         buffer.limit( 7 );  

  15.         ByteBuffer slice = buffer.slice();  

  16.           

  17.         // 改變子緩沖區的內容  

  18.         for (int i=0; i<slice.capacity(); ++i) {  

  19.             byte b = slice.get( i );  

  20.             b *= 10;  

  21.             slice.put( i, b );  

  22.         }  

  23.           

  24.         buffer.position( 0 );  

  25.         buffer.limit( buffer.capacity() );  

  26.           

  27.         while (buffer.remaining()>0) {  

  28.             System.out.println( buffer.get() );  

  29.         }  

  30.     }  

  31. }  

在該示例中,分配了一個容量大小為10的緩沖區,并在其中放入了數據0-9,而在該緩沖區基礎之上又創建了一個子緩沖區,并改變子緩沖區中的內容,從最后輸出的結果來看,只有子緩沖區“可見的”那部分數據發生了變化,并且說明子緩沖區與原緩沖區是數據共享的。

只讀緩沖區

只讀緩沖區非常簡單,可以讀取它們,但是不能向它們寫入數據。可以通過調用緩沖區的asReadOnlyBuffer()方法,將任何常規緩沖區轉 換為只讀緩沖區,這個方法返回一個與原緩沖區完全相同的緩沖區,并與原緩沖區共享數據,只不過它是只讀的。如果原緩沖區的內容發生了變化,只讀緩沖區的內容也隨之發生變化:

[java] view plain copy

 print?

  1. import java.nio.*;  

  2.   

  3. public class Program {  

  4.     static public void main( String args[] ) throws Exception {  

  5.         ByteBuffer buffer = ByteBuffer.allocate( 10 );  

  6.           

  7.         // 緩沖區中的數據0-9  

  8.         for (int i=0; i<buffer.capacity(); ++i) {  

  9.             buffer.put( (byte)i );  

  10.         }  

  11.   

  12.         // 創建只讀緩沖區  

  13.         ByteBuffer readonly = buffer.asReadOnlyBuffer();  

  14.           

  15.         // 改變原緩沖區的內容  

  16.         for (int i=0; i<buffer.capacity(); ++i) {  

  17.             byte b = buffer.get( i );  

  18.             b *= 10;  

  19.             buffer.put( i, b );  

  20.         }  

  21.           

  22.         readonly.position(0);  

  23.         readonly.limit(buffer.capacity());  

  24.           

  25.         // 只讀緩沖區的內容也隨之改變  

  26.         while (readonly.remaining()>0) {  

  27.             System.out.println( readonly.get());  

  28.         }  

  29.     }  

  30. }  

如果嘗試修改只讀緩沖區的內容,則會報ReadOnlyBufferException異常。只讀緩沖區對于保護數據很有用。在將緩沖區傳遞給某個 對象的方法時,無法知道這個方法是否會修改緩沖區中的數據。創建一個只讀的緩沖區可以保證該緩沖區不會被修改。只可以把常規緩沖區轉換為只讀緩沖區,而不能將只讀的緩沖區轉換為可寫的緩沖區。

直接緩沖區

直接緩沖區是為加快I/O速度,使用一種特殊方式為其分配內存的緩沖區,JDK文檔中的描述為:給定一個直接字節緩沖區,Java虛擬機將盡最大努 力直接對它執行本機I/O操作。也就是說,它會在每一次調用底層操作系統的本機I/O操作之前(或之后),嘗試避免將緩沖區的內容拷貝到一個中間緩沖區中 或者從一個中間緩沖區中拷貝數據。要分配直接緩沖區,需要調用allocateDirect()方法,而不是allocate()方法,使用方式與普通緩沖區并無區別,如下面的拷貝文件示例:

[java] view plain copy

 print?

  1. import java.io.*;  

  2. import java.nio.*;  

  3. import java.nio.channels.*;  

  4.   

  5. public class Program {  

  6.     static public void main( String args[] ) throws Exception {  

  7.         String infile = "c:\\test.txt";  

  8.         FileInputStream fin = new FileInputStream( infile );  

  9.         FileChannel fcin = fin.getChannel();  

  10.           

  11.         String outfile = String.format("c:\\testcopy.txt");  

  12.         FileOutputStream fout = new FileOutputStream( outfile );      

  13.         FileChannel fcout = fout.getChannel();  

  14.           

  15.         // 使用allocateDirect,而不是allocate  

  16.         ByteBuffer buffer = ByteBuffer.allocateDirect( 1024 );  

  17.           

  18.         while (true) {  

  19.             buffer.clear();  

  20.               

  21.             int r = fcin.read( buffer );  

  22.               

  23.             if (r==-1) {  

  24.                 break;  

  25.             }  

  26.               

  27.             buffer.flip();  

  28.               

  29.             fcout.write( buffer );  

  30.         }  

  31.     }  

  32. }  

內存映射文件I/O

內存映射文件I/O是一種讀和寫文件數據的方法,它可以比常規的基于流或者基于通道的I/O快的多。內存映射文件I/O是通過使文件中的數據出現為 內存數組的內容來完成的,這其初聽起來似乎不過就是將整個文件讀到內存中,但是事實上并不是這樣。一般來說,只有文件中實際讀取或者寫入的部分才會映射到內存中。如下面的示例代碼:

[java] view plain copy

 print?

  1. import java.io.*;  

  2. import java.nio.*;  

  3. import java.nio.channels.*;  

  4.   

  5. public class Program {  

  6.     static private final int start = 0;<span >  

  7.     static private final int size = 1024;  

  8.       

  9.     static public void main( String args[] ) throws Exception {  

  10.         RandomAccessFile raf = new RandomAccessFile( "c:\\test.txt", "rw" );  

  11.         FileChannel fc = raf.getChannel();  

  12.           

  13.         MappedByteBuffer mbb = fc.map( FileChannel.MapMode.READ_WRITE,  

  14.           start, size );  

  15.           

  16.         mbb.put( 0, (byte)97 );  

  17.         mbb.put( 1023, (byte)122 );  

  18.           

  19.         raf.close();  

  20.     }  

  21. }</span>  

上述內容就是如何進行Java NIO中緩沖區的分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

当阳市| 桃园县| 靖远县| 汝城县| 沾化县| 和田市| 平塘县| 利辛县| 屏东县| 通许县| 施甸县| 和田县| 阜平县| 文成县| 柘城县| 贵港市| 凤庆县| 凉山| 新闻| 高尔夫| 石家庄市| 泸州市| 建昌县| 潜山县| 丹阳市| 宁乡县| 汝州市| 惠安县| 务川| 砚山县| 民县| 班玛县| 济南市| 临朐县| 辽阳市| 晴隆县| 象山县| 尼玛县| 安阳县| 和田市| 浙江省|