package Ġcom . github . mj dev . lib a ums . driver . file Ċ Ċ import Ġcom . github . mj dev . lib a ums . driver . Block Device Driver Ċ import Ġjava . io .* Ċ import Ġjava . net . URL Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . channels . Channels Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġmagn us ja Ġon Ġ 0 1 / 0 8 / 1 7 . Ċ Ġ*/ Ċ Ċ class ĠFile Block Device Driver Ġ: ĠBlock Device Driver Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġfile : ĠRandom Access File ĊĠĠĠ Ġoverride Ġvar ĠblockSize : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġbyte Offset : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġval Ġblocks : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfile . length () Ġ/ ĠblockSize ĊĊĠĠĠ Ġ@ Throws ( FileNotFoundException :: class ) ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġconstructor ( file : ĠFile , Ġbyte Offset : ĠInt Ġ= Ġ 0 , ĠblockSize : ĠInt Ġ= Ġ 5 1 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . file Ġ= ĠRandom Access File ( file , Ġ" rw ") ĊĠĠĠĠĠĠĠ Ġthis . block Size Ġ= ĠblockSize ĊĠĠĠĠĠĠĠ Ġthis . byte Offset Ġ= Ġbyte Offset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġconstructor ( url : ĠURL , Ġbyte Offset : ĠInt Ġ= Ġ 0 , ĠblockSize : ĠInt Ġ= Ġ 5 1 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . byte Offset Ġ= Ġbyte Offset ĊĠĠĠĠĠĠĠ Ġval Ġr bc Ġ= ĠChannels . new Channel ( url . open Stream ()) ĊĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠFile . create TempFile (" lib a ums _ file _ block device ", Ġ". bin ") ĊĠĠĠĠĠĠĠ Ġtemp File . delete On Exit () ĊĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( temp File ) ĊĠĠĠĠĠĠĠ Ġf os . channel . transfer From ( r bc , Ġ 0 , Ġjava . lang . Long . MAX _ VALUE ) ĊĊĠĠĠĠĠĠĠ Ġthis . file Ġ= ĠRandom Access File ( temp File , Ġ" rw ") ĊĠĠĠĠĠĠĠ Ġthis . block Size Ġ= ĠblockSize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġinit () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġread ( device Offset : ĠLong , Ġbuffer : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile . seek ( device Offset Ġ* ĠblockSize Ġ+ Ġbyte Offset ) ĊĠĠĠĠĠĠĠ Ġval Ġread Ġ= Ġfile . read ( buffer . array (), Ġbuffer . position (), Ġbuffer . remaining ()) ĊĠĠĠĠĠĠĠ Ġbuffer . position ( buffer . position () Ġ+ Ġread ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġwrite ( device Offset : ĠLong , Ġbuffer : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile . seek ( device Offset Ġ* ĠblockSize Ġ+ Ġbyte Offset ) ĊĠĠĠĠĠĠĠ Ġfile . write ( buffer . array (), Ġbuffer . position (), Ġbuffer . remaining ()) ĊĠĠĠĠĠĠĠ Ġbuffer . position ( buffer . limit ()) ĊĠĠĠ Ġ} Ċ } Ċ