java 文件通道_Java NIO(四)文件通道
文件通道
通道是訪問I/O服務的導管,I/O可以分為廣義的兩大類:File I/O和Stream I/O。那么相應的,通道也有兩種類型,它們是文件(File)通道和套接字(Socket)通道。文件通道指的是FileChannel,套接字通道則有三個,分別是SocketChannel、ServerSocketChannel和DatagramChannel
通道可以有多種方式創建。Socket通道有直接創建Socket通道的工廠方法(open()方法)。一個FileChannel對象卻只能通過在一個打開的RandomAccessFile、FileInputStream或FileOutputStream對象上調用getChannel()方法來獲取,開發者不能直接創建一個FileChannel
文件通道總是阻塞的,不能置于非阻塞模式下
FileChannel對象是線程安全的。多個進程可以在同一個實例上并發調用方法而不會引起任何問題,不過并非所有的操作都是多線程的。影響通道位置或者影響文件的操作都是單線程的,如果有一個線程已經在執行會影響通道位置或文件大小的操作,那么其他嘗試進行此類操作之一的線程必須等待,并發行為也會受到底層操作系統或文件系統的影響。
打開FileChannel
RandomAccessFile aFile = new RandomAccessFile("data.txt", "rw");
FileChannel fileChannel= aFile.getChannel();
從FileChannel讀取數據
ByteBuffer buf = ByteBuffer.allocate(100);
int bytr = fileChannel.read(buf);
注意: read()方法返回的int值表示讀取了多少字節數到Buffer中,如果為-1,則表示到了文件末尾
向FileChannel中寫入數據
1 String str = "some thing";2 ByteBuffer buf = ByteBuffer.allocate(100);3 buf.clear();4 buf.put(str.getBytes());5 buf.flip();6 while(buf.hasRemaining()){7 fileChannel.write(buf);8 }
9 fileChannel.close();
注意:?write()方法是在while循環里的。因為無法保證write()一次能寫入多少字節,因此需要重復調用,知道Buffer中沒有尚未寫入到Channel中的數據
關閉FileChannel
fileChannel.close();
position()方法
有時可能需要在FileChannel中某個特定位置進行數據的讀寫操作,可以通過position()方法獲取FileChannel的當前位置,也可以通過position(long newPosition)設置FileChannel的位置
long position =channel.position();
channel.position(position+10);
注意:?如果將位置設置到文件結束符之后,然后讀取字節將返回-1,寫入字節,文件將擴大到當前位置,并將數據寫入通道。這可能導致“文件空洞”,磁盤上物理文件中寫入的數據間有空隙
size()方法
long size = fileChannel.size();
返回實例所關聯的文件大小
truncate()方法
fileChannel.truncate(1024);
該方法截取一個文件,截取文件時,文件中指定部分后面的數據將被刪除,上面的例子表示截取文件前1024個字節
force()方法
fileChannel.force(true);
該方法將通道里尚未寫入到磁盤的數據強制寫入到磁盤上。出于性能方面的考慮,操作系統會將數據緩存在內存中,所以無法保證寫入到FileChannel里的數據一定會即時寫到磁盤上。要保證這一點,需要調用force()方法。
force()方法有一個boolean類型的參數,指明是否同時將文件元數據(權限信息等)寫到磁盤上。
總結
以上是生活随笔為你收集整理的java 文件通道_Java NIO(四)文件通道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql引擎inndbmmyisam_
- 下一篇: 基于matlab的pcb焊盘,EDA复习