檔案通道建立方式綜述

2021-09-12 03:29:07 字數 3899 閱讀 5702

reference定義(phantomreference,cleaner):[url]

filechanne定義:[url]

檔案讀寫方式簡單綜述:[url]

檔案讀寫方式簡單綜述後續(檔案,流構造):[url]

在看了filechanne定義後,為了更好了理解filechanne,我們簡單的看了檔案file,路徑path ,檔案系統filesystem,檔案系統提供者filesystemprovider。我們先回顧下相關概念:

file內部關聯乙個檔案系統filesystem,用於操作底層的系統,file的檔案分隔符和路徑分隔符都是從filesystem獲取,windows(\\,;)和unix(\,:)有所不同,filesystem根據底層操作獲取不同檔案系統實現,windows預設為win32filesystem。file的建立,刪除,list當前目錄檔案等待操作,實際是委託給win32filesystem。獲取檔案path,首先獲取檔案的預設檔案系統提供者,預設為windowsfilesystemprovider,windowsfilesystemprovider通過檔案path(uri),建立檔案path(windowspath),這個主要用於建立檔案通達需要。

今天我們來看一下通道的具體實現,從獲取通道開始,獲取通道有4中方法:

1.從fileoutputstream獲取可寫不可讀檔案通道

//fileoutputstream

2.從fileinputstream獲取可讀不可寫檔案通道

//fileinputstream

public filechannel getchannel() 

return channel;

}}

3.從randomaccessfile獲取可讀可寫檔案通道

//randomaccessfile

public class randomaccessfile implements dataoutput, datainput, closeable 

return channel;}}

...}

//filechannelimpl

4.從檔案系統提供者獲取檔案通道(filechannel#open)

//filechannel

//根據檔案path和開啟選項建立檔案通道

public static filechannel open(path path, openoption... options)

throws ioexception

//根據檔案path,開啟選項,及檔案屬性建立檔案通道

public static filechannel open(path path,

set<? extends openoption> options,

fileattribute<?>... attrs)

throws ioexception

//windowsfilesystemprovider

public transient filechannel newfilechannel(path path, set set, fileattribute afileattribute)

throws ioexception

再來看windowschannelfactory建立檔案通道:

上述過程我們需要關注的有以下幾點:

1.

//轉換開啟選項集為flags

flags flags = flags.toflags(set);

2.

//建立檔案描述符

filedescriptor filedescriptor = open(s, s1, flags, l);

3.下面分別來看:

1.

//轉換開啟選項集為flags

flags flags = flags.toflags(set);

2.

//建立檔案描述符

filedescriptor filedescriptor = open(s, s1, flags, l);

來看這一步的關鍵點:

//建立檔案

long l1 = windowsnativedispatcher.createfile(s, i, j, l, byte0, k);

//windowsnativedispatcher

static long createfile(string s, int i, int j, int k, int l)

throws window***ception

static long createfile(string s, int i, int j, long l, int k, int i1)

throws window***ception

private static native long createfile0(long l, int i, int j, long l1, int k, int i1)

throws window***ception;

建立方法中我們還有兩點要看

2.a

//將檔案path資訊,放在本地buffer中

nativebuffer nativebuffer = asnativebuffer(s);

2.b

//釋放nativebuffer,放入執行緒本地快取,以便重用

nativebuffer.release();

下面分別來看這兩點:

再看這個之前先看一下nativebuffer

//nativebuffer

class nativebuffer

private final long address;

deallocator(long l)

}nativebuffer(int i)

void release()

long address()

int size()

cleaner cleaner()

void setowner(object obj)

object owner()

}

再回到剛才建立檔案中的兩點

2.a

//將檔案path資訊,放在本地buffer中

nativebuffer nativebuffer = asnativebuffer(s);

//windowsnativedispatcher

static nativebuffer asnativebuffer(string s)

2.b

//釋放nativebuffer,放入執行緒本地快取,以便重用

nativebuffer.release();

//nativebuffers

void release()

從以上a,b兩點,我們需要關注的是getnativebufferfromcache,allocnativebuffer,releasenativebuffer方法,

下面我們單獨來看一下nativebuffers

3.在這一步我們又看到了filechannelimpl#open方法,這個我們在後面再看。

[size=medium][b]總結:[/b][/size]

通道控制方式,通道指令與通道程式

i o通道是dma的進一步發展,進一步減少cpu的干預,dma是每次對乙個資料塊進行操作,通道是一次對一組資料塊進行操作。通道實質是簡單的處理器。擁有命令暫存器,位址暫存器,有通道程式,指令單一,但是沒有專有的記憶體 cpu中 1.使用者程序提出i o請求,喚醒裝置驅動程序 參考 其他文章,我後續會...

程序間通訊方式 綜述

linux程序間一共有六種通訊方式 1.管道 無名管道 pipe 和有名管道 fifo 2.訊號 signal 3.訊號量 semaphore 4.訊息佇列 messagequeue 5.共享記憶體 shared memory 6.套接字 socket 1.管道 管道分為無名管道 pipe 和有名管...

tcp檔案雙通道傳輸 命令通道和資料通道的關聯

開始的設計 1.開乙個固定的埠監聽,接收命令通道連線。2.開始傳輸資料的時候,為每個使用者臨時開乙個監聽埠,接收資料通道連線。這樣問題在於 資料通道的埠不能用固定的埠來傳輸資料,這樣如果有防火牆,就不知道應該給這個伺服器程式開那些埠,即使把這些資料通道的埠限制在一 定範圍內,實際上還是不好,開的埠過...