package Ġmk . web factory . storage Ċ Ċ import Ġio . reactivex . rx java 3 . annotations . NonNull Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io .* Ċ import Ġjava . nio . channels . File Lock ĊĊ Ċ private Ġval Ġlogger : ĠLogger Ġ= ĠLoggerFactory . getLogger (" Util ") Ċ Ċ private Ġconst Ġval ĠDEF _ BYTE _ BUFFER _ SIZE Ġ= Ġ 9 6 0 0 0 Ċ Ċ fun Ġread Fully Utf 8 ( file : ĠFile ): ĠString ? Ġ{ ĊĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" File Ġnot Ġfound Ġ" Ġ+ Ġfile . path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġfis : ĠFileInputStream ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġbr : ĠBufferedReader ? Ġ= Ġnull ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġfis Ġ= ĠFileInputStream ( file ) ĊĠĠĠĠĠĠĠ Ġbr Ġ= ĠBufferedReader ( InputStream Reader ( fis , Ġ" UTF - 8 ")) ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġline : ĠString ? ĊĠĠĠĠĠĠĠ Ġwhile Ġ( br . readLine (). also Ġ{ Ġline Ġ= Ġit Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . append ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . append ('\ n ') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontent . remove Suffix ("\ n "). toString () ĊĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfis ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbr ?. close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠConvenience Ġfor Ġcalling Ġ[ write ] Ġwith Ġa ĠByteArrayInputStream . Ġ Ġ*/ Ċ fun Ġwrite Utf 8 ( content : ĠString , Ġout File : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġwrite ( content . toByteArray (), Ġout File ) Ċ } Ċ Ċ /** ĠConvenience Ġfor Ġcalling Ġ[ write ] Ġwith Ġa ĠByteArrayInputStream . Ġ Ġ*/ Ċ fun Ġwrite ( bytes : ĠByteArray ?, Ġout File : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġwrite ( ByteArray InputStream ( bytes ), Ġout File ) Ċ } Ċ Ċ /** Ġ@ return Ġtrue Ġif Ġ[ content ] Ġwas Ġwritten Ġin Ġ[ out File ]. Ċ Ġ*/ Ċ fun Ġwrite ( content : ĠInputStream , Ġout File : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( out File . parent File . mkdir s () Ġ&& Ġ! out File . parent File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Cannot Ġcreate Ġfile Ġ${ out File . path }") ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġout Stream : ĠBuffered OutputStream ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġin Stream : ĠBuffered InputStream ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġlock : ĠFile Lock ? Ġ= Ġnull ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( out File ) ĊĠĠĠĠĠĠĠ Ġlock Ġ= Ġf os . channel . lock () ĊĠĠĠĠĠĠĠ Ġout Stream Ġ= ĠBuffered OutputStream ( fos ) ĊĠĠĠĠĠĠĠ Ġin Stream Ġ= ĠBuffered InputStream ( content ) ĊĠĠĠĠĠĠĠ Ġval Ġbuffer : ĠByteArray Ġ= Ġif Ġ( in Stream . available () Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray ( DEF _ BYTE _ BUFFER _ SIZE ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray ( Math . min ( in Stream . available (), ĠDEF _ BYTE _ BUFFER _ SIZE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġbytes Read : ĠInt ĊĠĠĠĠĠĠĠ Ġwhile Ġ( in Stream . read ( buffer ). also Ġ{ Ġbytes Read Ġ= Ġit Ġ} Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Stream . write ( buffer , Ġ 0 , Ġbytes Read ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrelease File Lock ( lock ) ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease File Lock ( lock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( out Stream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Stream . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Stream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Stream ?. close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġfile Ġwas Ġdeleted Ġor Ġdoes Ġnot Ġexist , Ċ Ġ* Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġ[ file ] Ġpoints Ġto Ġa Ġdirectory . Ċ Ġ*/ Ċ fun Ġdelete File (@ NonNull Ġfile : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ! file . exists () Ġ|| Ġfile . isFile Ġ&& Ġfile . delete () Ċ } Ċ Ċ private Ġfun Ġrelease File Lock ( lock : ĠFile Lock ?) Ġ{ ĊĠĠĠ Ġif Ġ( lock Ġ!= Ġnull Ġ&& Ġlock . isValid ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . release () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }