對檔案的切片/合併在應用中是乙個很常見的需求,使用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...