(三)NIO元件Channel+ByteBuffer操作檔案【玩轉Netty系列】
FileChannel
Java NIO
中的FileChannel
是一個連線到檔案的通道。可以通過檔案通道讀寫檔案,我們可以通過InputStream、OutputStream
或RandomAccessFile
來獲取它的例項,FileChannel
無法設定為非阻塞模式。
FileOutputStream fos = new FileOutputStream("F:\\abcd.txt");
FileChannel fosChannel = fos.getChannel();
常用API
public int read(ByteBuffer dst)
:從通道讀取資料並放到快取區中public int write(ByteBuffer src)
:把緩衝區的資料寫到通道中public long transferFrom(ReadableByteChannel src,long position,long count)
:從目標通道中複製資料到當前通道public long transferTo(long position,long count,WritableByteChannel target)
:把資料從當前通道複製給目標通道
使用案例
以下案例中會使用到
ByteBuffer
,它的底層的本質是一個陣列,就是用來存放內容的,這裡你可以看成是一個byte[]
,在本系列的上一節有專門針對ByteBuffer
進行講解。
- 使用FileChannel.write方法像磁碟寫入一個檔案
public static void write() throws IOException { //通過輸出流獲取FileChannel FileOutputStream fos = new FileOutputStream("F:\\abc.txt"); FileChannel channel = fos.getChannel(); //檔案中的內容 String str = "hello,it235"; //初始化空間,並將byte陣列放入buffer中 ByteBuffer byteBuffer = ByteBuffer.allocate(1024); ByteBuffer put = byteBuffer.put(str.getBytes()); //翻轉buffer,將緩衝區的資料寫入通道 put.flip(); channel.write(put); fos.close(); }
- 使用FileChannel.read讀取磁碟中的檔案
public static void read() throws IOException { //IO流讀取File File file = new File("F:\\abc.txt"); FileInputStream fis = new FileInputStream(file); //獲取Channel FileChannel channel = fis.getChannel(); //檔案內容長度 long length = file.length(); //例項化檔案內容長度大小的緩衝區,用來臨時存放讀取出來的內容 ByteBuffer byteBuffer = ByteBuffer.allocate((int)length); channel.read(byteBuffer); //取出位元組陣列,並輸出 System.out.println(new String(byteBuffer.array())); fis.close(); }
- 使用FileChannel.write+read方法進行檔案的拷貝
/** * 拷貝檔案 * @throws IOException */ public static void copy() throws IOException { //使用IO流讀取檔案,並拿到FileChannel File file = new File("F:\\abc.txt"); FileInputStream fis = new FileInputStream(file); FileChannel fisChannel = fis.getChannel(); //指定IO輸出檔案位置,並拿到FIleChannel FileOutputStream fos = new FileOutputStream("F:\\abcd.txt"); FileChannel fosChannel = fos.getChannel(); //宣告緩衝區大小 ByteBuffer byteBuffer = ByteBuffer.allocate(1024); //迴圈讀取並寫入 while(true){ //從fisChannel中取出內容到buffer中 int read = fisChannel.read(byteBuffer); //如果沒有內容了,則跳出迴圈 if(read == -1){ break; }else{ //因為使用的事buffer,所以需要翻轉 byteBuffer.flip(); //使用fosChannel將buffer寫入檔案 fosChannel.write(byteBuffer); } //每次使用完byteBuffer後需要復位 byteBuffer.clear(); } fos.close(); fis.close(); }
- 使用FileChannel.transferFrom或transferTo進行檔案的拷貝
public static void copyApi() throws IOException { //指定IO輸入、輸出檔案位置 FileInputStream fis = new FileInputStream("F:\\abc.txt"); FileOutputStream fos = new FileOutputStream("F:\\abcd.txt"); //原始檔Channel FileChannel sourceChannel = fis.getChannel(); //目標檔案CHannel FileChannel destChannel = fos.getChannel(); //A:拷貝檔案:從目標通道中複製資料到當前通道 destChannel.transferFrom(sourceChannel , 0 , sourceChannel.size()); //B:拷貝檔案2:從原始檔通道中複製資料到目標通道 //sourceChannel.transferTo(0 , sourceChannel.size() , destChannel ); //關閉資源 sourceChannel.close(); destChannel.close(); fos.close(); fis.close(); }
到此案例結束,接下來,我們來學習更多的內容…
相關文章
- netty系列之:NIO和netty詳解Netty
- Java NIO Path介面操作檔案Java
- Linux下玩轉nginx系列(三)---nginx日誌配置檔案說明LinuxNginx
- java NIO 常用的檔案操作方法Java
- Netty - 眼熟NIONetty
- 輕鬆玩轉Python檔案操作:移動、刪除Python
- 【Gin-API系列】配置檔案和資料庫操作(三)API資料庫
- Java7 新特性 —— java.nio.file 檔案操作Java
- Linux下玩轉nginx系列(二)——nginx配置檔案說明LinuxNginx
- (三)fs檔案操作模組
- 優雅的操作檔案:java.nio.file 庫介紹Java
- Java NIO學習系列三:SelectorJava
- nio aio netty區別AINetty
- 【轉】Go檔案操作大全Go
- Javascript----檔案操作 (轉)JavaScript
- netty系列之:搭建HTTP上傳檔案伺服器NettyHTTP伺服器
- 一起玩轉玩轉LiteOS元件:TinyFrame元件
- Netty原始碼分析--NIO(一)Netty原始碼
- 轉:Java NIO系列教程(四) Scatter/GatherJava
- Java NIO系列2:NIO概述Java
- 【JVM】JVM系列之Class檔案(三)JVM
- 如何在Java中使用檔案操作API: java.nio.file.Path?- marcobehlerJavaAPI
- Java NIO 檔案通道 FileChannel 用法Java
- Java NIO複製檔案功能Java
- netty系列之:搭建自己的下載檔案伺服器Netty伺服器
- 玩轉 Cgroup 系列之三:挑戰手動管理 Cgroup
- Netty 系列文章之基本元件概覽Netty元件
- C#初學者教程系列22:檔案操作C#
- Netty入門系列(3) --使用Netty進行編解碼的操作Netty
- Win XP檔案屬性玩花樣(轉)
- caj轉pdf檔案怎麼操作?
- Java中對檔案的操作 (轉)Java
- 在shell提示下操作檔案(轉)
- 從BIO和NIO到Netty實踐Netty
- Netty(二)—— NIO 零拷貝機制Netty
- 自制支援檔案拖放的VCL元件 (轉)元件
- Html5學習系列(四)檔案操作APIHTMLAPI
- 玩轉大資料系列之三:資料包表與展示大資料