package Ġcom . b aj dcc . L AL R 1 . grammar . runtime . service Ċ Ċ import Ġcom . b aj dcc . L AL R 1 . grammar . runtime . RuntimeObject Ċ import Ġcom . b aj dcc . L AL R 1 . grammar . runtime . data . Runtime Array Ċ import Ġorg . apache . log 4 j . Logger Ċ import Ġjava . io .* Ċ import Ġjava . nio . charset . StandardCharsets . UTF _ 8 Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠãĢĲ è¿Ĳè¡Į æĹ¶ ãĢĳ è¿Ĳè¡Į æĹ¶ æĸĩä»¶ æľįåĬ¡ Ċ Ġ* Ċ Ġ* Ġ@ author Ġb aj dcc Ċ Ġ*/ Ċ class ĠRuntime File Service ( private Ġval Ġservice : ĠRuntime Service ) Ġ: ĠI Runtime File Service Ġ{ ĊĠĠĠ Ġprivate Ġval Ġarr Files Ġ= ĠArray < File Struct ? >( MAX _ FILE ) Ġ{ Ġnull Ġ} ĊĠĠĠ Ġprivate Ġval Ġset File Id Ġ= Ġmutable Set Of < Int >() ĊĠĠĠ Ġprivate Ġval Ġmap File Names Ġ= Ġmutable Map Of < String , ĠInt >() ĊĠĠĠ Ġprivate Ġvar Ġcycle Ptr Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġmap V fs Ġ= Ġmutable Map Of < String , ĠV fs Struct >() ĊĊĠĠĠ Ġoverride Ġval Ġv fs List Size : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmap V fs . size . to Long () ĊĊĠĠĠ Ġoverride Ġfun Ġadd V fs ( name : ĠString , Ġcontent : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmap V fs [ V FS _ PREFIX Ġ+ Ġname ] Ġ= ĠV fs Struct ( content . toByteArray ( UTF _ 8 ), Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget V fs ( name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( map V fs . containsKey ( name )) ĠString ( map V fs [ name ] !!. data !! ) Ġelse Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġencode Handle ( handle : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhandle Ġ+ ĠOFFSET _ FILE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecode Handle ( handle : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhandle Ġ- ĠOFFSET _ FILE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate ( name : ĠString , Ġmode : ĠInt , Ġencoding : ĠString , Ġpage : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( set File Id . size Ġ>= ĠMAX _ FILE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( map File Names . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġhandle : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġfs Ġ= ĠFile Struct ( name , Ġmode , Ġencoding , Ġmap V fs , Ġpage ) ĊĠĠĠĠĠĠĠ Ġif Ġ( fs . status Ġ== ĠFile Status . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arr Files [ cycle Ptr ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ġ= Ġcycle Ptr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset File Id . add ( cycle Ptr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap File Names [ name ] Ġ= Ġcycle Ptr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarr Files [ cycle Ptr ++] Ġ= Ġfs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cycle Ptr Ġ>= ĠMAX _ FILE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcycle Ptr Ġ-= ĠMAX _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcycle Ptr ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cycle Ptr Ġ>= ĠMAX _ FILE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcycle Ptr Ġ-= ĠMAX _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . debug (" File Ġ#$ handle Ġ'$ name ' Ġcreated ") ĊĠĠĠĠĠĠĠ Ġreturn Ġencode Handle ( handle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdestroy ( handle : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġh Ġ= Ġhandle ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġdecode Handle ( h ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! set File Id . contains ( h )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfs Ġ= Ġarr Files [ h ] !! ĊĠĠĠĠĠĠĠ Ġlogger . debug (" File Ġ# " Ġ+ Ġh Ġ+ Ġ" Ġ'" Ġ+ Ġfs . name Ġ+ Ġ"' Ġdestroyed ") ĊĠĠĠĠĠĠĠ Ġif Ġ( fs . vfs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap File Names . remove ( fs . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfs . destroy ( map V fs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr Files [ h ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset File Id . remove ( h ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap File Names . remove ( fs . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfs . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr Files [ h ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset File Id . remove ( h ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġdata Ġclass ĠV fs Struct ( val Ġdata : ĠByteArray ? Ġ= Ġnull , Ġval Ġreadonly : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġas ĠV fs Struct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Arrays . equals ( data , Ġother . data )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( readonly Ġ!= Ġother . readonly ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġdata ?. let Ġ{ ĠArrays . hashCode ( it ) Ġ} Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġreadonly . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( handle : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġh Ġ= Ġhandle ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġdecode Handle ( h ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! set File Id . contains ( h )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġarr Files [ h ] !!. read () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread String ( handle : ĠInt ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġh Ġ= Ġhandle ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġdecode Handle ( h ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! set File Id . contains ( h )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġarr Files [ h ] !!. readString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( handle : ĠInt , Ġch : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġh Ġ= Ġhandle ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġdecode Handle ( h ) ĊĠĠĠĠĠĠĠ Ġreturn Ġset File Id . contains ( h ) Ġ&& Ġarr Files [ h ] !!. write ( ch ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite String ( handle : ĠInt , Ġstr : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġh Ġ= Ġhandle ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġdecode Handle ( h ) ĊĠĠĠĠĠĠĠ Ġreturn Ġset File Id . contains ( h ) Ġ&& Ġarr Files [ h ] !!. writeString ( str ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexists ( filename : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilename . startsWith ( V FS _ PREFIX ) Ġ-> Ġmap V fs . containsKey ( filename ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilename . startsWith ( RESOURCE _ PREFIX ) Ġ-> Ġjava Class . getResource AsStream ( filename . substring ( 1 )) Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmap File Names . containsKey ( filename ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread All ( filename : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filename . startsWith ( V FS _ PREFIX )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( map V fs . containsKey ( filename )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString ( map V fs [ filename ] !!. data !! , ĠUTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsize (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap File Names . size . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstat ( api : ĠBoolean ): ĠRuntime Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmode String Ġ= ĠarrayOf ("", Ġ" è¯»åıĸ ", Ġ" æĪª æĸŃ ", Ġ" è¿½åĬł ") ĊĠĠĠĠĠĠĠ Ġval Ġstatus String Ġ= ĠarrayOf (" éĶĻè¯¯ ", Ġ" è¯»åıĸ ", Ġ" åĨĻåħ¥ ") ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠRuntime Array () ĊĠĠĠĠĠĠĠ Ġif Ġ( api ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap File Names . values . sorted By Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġa Ġ-> Ġarr Files [ a ] !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠRuntime Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . add ( RuntimeObject ( value . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . add ( RuntimeObject ( mode String [ value . mode ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . add ( RuntimeObject ( value . page )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . add ( RuntimeObject ( status String [ value . status . ordinal ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . add ( RuntimeObject ( value . encoding )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . add ( RuntimeObject ( if Ġ( value . vfs ) Ġ" æĺ¯ " Ġelse Ġ" åĲ¦ ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray . add ( RuntimeObject ( item )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . add ( RuntimeObject ( String . format (" ĠĠ Ġ%- 3 0 s ĠĠ Ġ%- 5 s ĠĠ Ġ%- 1 0 s ĠĠ Ġ%- 1 0 s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Name ", Ġ" Mode ", Ġ" Status ", Ġ" Encoding "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap File Names . values . sorted By Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġa Ġ-> Ġarr Files [ a ] !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray . add ( RuntimeObject ( String . format (" ĠĠ Ġ%- 3 0 s ĠĠ Ġ%- 5 s ĠĠ Ġ%- 1 0 s ĠĠ Ġ%- 1 0 s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . name , Ġvalue . mode , Ġvalue . status . toString (), Ġvalue . encoding ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġarray ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget V fs List ( api : ĠBoolean ): ĠRuntime Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠRuntime Array () ĊĠĠĠĠĠĠĠ Ġif Ġ( api ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap V fs . entries . sorted By Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠRuntime Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . add ( RuntimeObject ( value . key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . add ( RuntimeObject ( value . value . data !!. size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . add ( RuntimeObject ( if Ġ( value . value . readonly ) Ġ" æĺ¯ " Ġelse Ġ" åĲ¦ ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray . add ( RuntimeObject ( item )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . add ( RuntimeObject ( String . format (" ĠĠ Ġ%- 2 5 s ĠĠ Ġ%- 5 s ĠĠ Ġ%- 5 s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Name ", Ġ" Size ", Ġ" Readonly "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap V fs . entries . sorted By Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray . add ( RuntimeObject ( String . format (" ĠĠ Ġ%- 2 5 s ĠĠ Ġ%- 1 5 s ĠĠ Ġ%- 5 s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . key , Ġvalue . value . data !!. size , Ġvalue . value . readonly ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġarray ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread And Destroy ( name : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name . startsWith ( V FS _ PREFIX )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( map V fs . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠString ( map V fs [ name ] !!. data !! , ĠUTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap V fs . remove ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġenum Ġclass ĠFile Status Ġ{ ĊĠĠĠĠĠĠĠ ĠERROR , ĊĠĠĠĠĠĠĠ ĠREAD ING , ĊĠĠĠĠĠĠĠ ĠWR IT ING ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠFile Struct ( var Ġname : ĠString , Ġval Ġmode : ĠInt , Ġval Ġencoding : ĠString , Ġmap V fs : ĠMutable Map < String , ĠV fs Struct >, Ġval Ġpage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstatus : ĠFile Status ĊĠĠĠĠĠĠĠ Ġvar Ġreader : ĠBufferedReader ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġwriter : ĠBuffered Writer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġv fs : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġba os : ĠByteArrayOutputStream ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . status Ġ= ĠFile Status . ERROR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . vfs Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ== Ġ 1 ) Ġ{ Ġ// Ġread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . startsWith ( V FS _ PREFIX )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġmap V fs [ name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb ais Ġ= ĠByteArrayInputStream ( v . data !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis r Ġ= ĠInputStreamReader ( ba is , Ġencoding ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader Ġ= ĠBufferedReader ( isr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . status Ġ= ĠFile Status . READ ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . vfs Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream : ĠInputStream Ġ= Ġif Ġ( name . startsWith ( RESOURCE _ PREFIX )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class . getResource AsStream ( name . substring ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileInputStream ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis r Ġ= ĠInputStreamReader ( inputStream , Ġencoding ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader Ġ= ĠBufferedReader ( isr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . status Ġ= ĠFile Status . READ ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( mode Ġand Ġ 2 Ġ!= Ġ 0 ) Ġ{ Ġ// Ġwrite ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . startsWith ( V FS _ PREFIX )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvs Ġ= Ġmap V fs [ name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vs Ġ== Ġnull Ġ|| Ġ! vs . readonly ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmode : 2 = truncate Ġmode : 3 = append ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġba os Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( map V fs . containsKey ( name ) Ġ&& Ġmode Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġba os !!. write ( map V fs [ name ] !!. data !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo sw Ġ= ĠOutputStream Writer ( ba os !! , Ġencoding ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter Ġ= ĠBuffered Writer ( os w ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . status Ġ= ĠFile Status . WR IT ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . vfs Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmode : 2 = truncate Ġmode : 3 = append ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( name , Ġmode Ġand Ġ 1 Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo sw Ġ= ĠOutputStream Writer ( fos , Ġencoding ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter Ġ= ĠBuffered Writer ( os w ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . status Ġ= ĠFile Status . WR IT ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġread (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠFile Status . READ ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreader !!. read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġread String (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠFile Status . READ ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreader !!. readLine () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite ( ch : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠFile Status . WR IT ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter !!. write ( ch . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrite String ( str : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠFile Status . WR IT ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter !!. write ( str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠFile Status . READ ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader !!. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( status Ġ== ĠFile Status . WR IT ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter !!. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdestroy ( map V fs : ĠMutable Map < String , ĠV fs Struct >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! vfs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠFile Status . READ ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader !!. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( status Ġ== ĠFile Status . WR IT ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter !!. flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap V fs [ name ] Ġ= ĠV fs Struct ( ba os !!. toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter !!. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠOFFSET _ FILE Ġ= Ġ 2 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ FILE Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠV FS _ PREFIX Ġ= Ġ"$ " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESOURCE _ PREFIX Ġ= Ġ" !" ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger . getLogger (" file ") ĊĠĠĠ Ġ} Ċ } Ċ