JAVA-6NIO之FileChannel
Java NIO中的FileChannel是一個連接到檔案的通道。可以透過檔案通道讀寫檔案。
FileChannel無法設定為非阻塞模式,它總是運行在阻塞模式下。
開啟FileChannel
在使用FileChannel之前,必須先開啟它。但是,我們無法直接開啟一個FileChannel,需要透過使用一個InputStream、OutputStream或RandomAccessFile來取得一個FileChannel實例。
從FileChannel讀取資料
呼叫多個read()方法之一從FileChannel讀取資料。
首先,先分配一個Buffer。從FileChannel讀取的資料將會被讀取到Buffer中。
然後,呼叫FileChannel.read()方法。此方法將資料從FileChannel讀取到Buffer中。 read()方法傳回的int值表示了有多少位元組被讀到了Buffer中。如果返回-1,表示到了文件末尾。
寫入資料到FileChannel
使用FileChannel.write()方法向FileChannel寫數據,該方法的參數是一個Buffer。
注意FileChannel.write()是在while循環中呼叫的。因為無法保證write()方法一次能向FileChannel寫入多少字節,因此需要重複呼叫write()方法,直到Buffer中已經沒有尚未寫入通道的位元組。
關閉FileChannel
用完FileChannel後必須將其關閉。如:
FileChannel的position方法
有時可能需要在FileChannel的某個特定位置進行資料的讀取/寫入操作。可以透過呼叫position()方法來取得FileChannel的目前位置。
也可以透過呼叫position(long pos)方法來設定FileChannel的目前位置。
如果將位置設定在檔案結束符之後,然後試圖從檔案通道讀取數據,讀取方法將會傳回-1 - 檔案結束標誌。
如果將位置設定在檔案結束符之後,然後向通道中寫入數據,檔案將撐大到目前位置並寫入資料。這可能導致“檔案空洞”,磁碟上實體檔案中寫入的資料間有空隙。
FileChannel的size方法
FileChannel實例的size()方法將傳回該實例所關聯檔案的大小。如:
FileChannel的truncate方法
可以使用FileChannel.truncate()方法截取一個檔案。截取檔案時,檔案將中指定長度後面的部分將被刪除。如:
這個範例截取檔案的前1024個位元組。
FileChannel的force方法
FileChannel.force()方法將頻道尚未寫入磁碟的資料強制寫入磁碟。出於效能方面的考慮,作業系統會將資料快取在記憶體中,所以無法保證寫入到FileChannel裡的資料一定會即時寫到磁碟上。要保證這一點,需要呼叫force()方法。
force()方法有一個boolean類型的參數,指明是否同時將檔案元資料(權限資訊等)寫到磁碟上。
/** * file channel */@Testpublic void text1() throws IOException {//从buffer读RandomAccessFile raf = new RandomAccessFile(new File("./test.txt"),"rw"); FileChannel channel = raf.getChannel(); //获取通道channel.position(channel.size()); //设置文件末尾位置,作为写入初始位置;不带参获取指针位置ByteBuffer byteBuffer = ByteBuffer.allocate(1024); //缓冲区byteBuffer.put("456".getBytes()); byteBuffer.flip(); //反转while (byteBuffer.hasRemaining()) { //判断 channel.write(byteBuffer); } channel.truncate(2); //截取文件channel.force(true); //强行写 raf.close();//向buffer写raf = new RandomAccessFile(new File("./test.txt"),"rw"); channel = raf.getChannel(); byteBuffer = ByteBuffer.allocate(1024);int read;while ((read = channel.read(byteBuffer))!=-1) { byteBuffer.flip(); //反转while (byteBuffer.hasRemaining()) { //判断System.err.print((char)byteBuffer.get()); //输出 } byteBuffer.clear(); //清除 } }
以上是JAVA-6NIO之FileChannel的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。
