對檔案的切片/合併在應用中是乙個很常見的需求,使用filechannel
的transferto
/transferfrom
的零拷貝方法(需要作業系統支援),可以高效的完成。
/**
* 對檔案按照指定大小進行分片,在檔案所在目錄生成分片後的檔案塊兒
* @param file
* @param chunksize
* @throws ioexception
*/public
static
void
chunkfile
(path file,
long chunksize)
throws ioexception
if(chunksize <1)
// 原始檔案大小
final
long filesize = files.
size
(file)
;// 分片數量
final
long numberofchunk = filesize % chunksize ==
0? filesize / chunksize :
(filesize / chunksize)+1
;// 原始檔名稱
final string filename = file.
getfilename()
.tostring()
;// 讀取原始檔案
try(filechannel filechannel = filechannel.
open
(file, enumset.
of(standardopenoption.read)))
// 分片檔名稱
path chunkfile = paths.
get(filename +
"-"+
(i +1)
);try(filechannel chunkfilechannel = filechannel.
open
(file.
resolvesibling
(chunkfile)
, enumset.
of(standardopenoption.create_new, standardopenoption.write)))
}}}
/**
* 把多個檔案合併為乙個檔案
* @param file 目標檔案
* @param chunkfiles 分片檔案
* @throws ioexception
*/public
static
void mergefile (path file, path .
.. chunkfiles)
throws ioexception
try(filechannel filechannel = filechannel.
open
(file, enumset.
of(standardopenoption.create_new, standardopenoption.write)))
}}}
使用零拷貝對檔案高效的切片和合併
對檔案的切片 合併在應用中是乙個很常見的需求,使用filechannel的transferto transferfrom的零拷貝方法 需要作業系統支援 可以高效的完成。對檔案按照指定大小進行分片,在檔案所在目錄生成分片後的檔案塊兒 param file param chunksize throws ...
零拷貝 高效地傳輸檔案
基於使用者緩衝區傳輸檔案時,過多的記憶體拷貝與上下文切換次數會降低效能。零拷貝技術在核心中完成記憶體拷貝,天然降低了記憶體拷貝次數。它通過一次系統呼叫合併了磁碟讀取與網路傳送兩個操作,降低了上下文切換次數。尤其是,由於拷貝在核心中完成,它可以最大化使用 socket 緩衝區的可用空間,從而提高了一次...
如何高效傳輸檔案之零拷貝
pagecache 磁碟快取記憶體 大檔案零拷貝下的問題 非同步io 直接io 總結磁碟是主機中最慢的硬體,往往是效能的瓶頸,優化它能獲得立竿見影的效果。針對磁碟的優化技術有零拷貝 直接io 非同步io等 主要目的是為了降低時延 提公升作業系統的吞吐量,圍繞著核心的磁碟快取記憶體 pagecache...