public class hiIO extends hiThread
単純関数:
WindowsではファイルのオープンやFileクラスで初めてファイルにアクセスする場合 極めて長い時間がかかる場合があります。時には単なるtextファイルをオープンする だけに数分かかる場合もあります。
これらはメソッドが完了しない状態であり、単純にスレッドにinterruptをかけても終了させることができません。
hiIOクラスではファイルのオープンメソッドの幾つかと、Fileクラスの機能の幾つかを
用意し、これらの呼び出しを、別スレッドから中断する機構を設けました。
中断された場合hiIO.Canceled(例外)が投げられます。
例えばタイムアウト指定がなく同期式であり、状態によっては1分近く固まってしまうFile.exists()を次のようして1秒でタイムアウトさせることができます。
   try{
      final hiIO                 _io       = new hiIO();
      hiThread.start(()->{hiTrread.sleep(1000);_io.cancel();}});//1秒でキャンセル
      if( _io.exists("K:/BDMV/") ) System.out.println("K:/BDMV exists");
      else System.out.println("K:/BDMV dose not exist");
      }
   catch(hiIO.CanceledException _tout){
      System.out.println("time out");
      }
   catch(Exception _ex){
      System.out.println(_ex);
      }
なお、実際にI/O動作しているスレッドにはinterruptがかけられますが、直ちに処理が終了するわけではないことに注意が必要です。
スレッドを用いた若干重い仕組みであるため、readやwriteは用意してありません。 Windowsではオープンさえできればreadやwriteは順調に動作することも考慮しました。
資源管理しラムダ式を呼び出す:
資源のオープンを行い、利用者のラムダ式を呼び出した後、クローズを行うuseXXXX()メソッドを用意しました。 例外発生時も確実にクローズを行います。
    void foo(String fileName_,PrintWriter pw_)throws Exception{
       // ... ファイル出力処理
       }
    //...
       hiIO io=new hiIO();
       io.useTextFileW(fileName_,"utf-8",hiU.APPEND,(_n_,_a_)->foo(_n_,_a_));
外部スレッドからのcancelも可能です。
| 修飾子とタイプ | クラスと説明 | 
|---|---|
| static interface  | hiIO.MessengerIO機構からのメッセージを受ける. | 
hiThread.CanceledException, hiThread.IntThreadThread.State, Thread.UncaughtExceptionHandlerMAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY| コンストラクタと説明 | 
|---|
| hiIO() | 
| 修飾子とタイプ | メソッドと説明 | 
|---|---|
| String | absolutePath(File file_)指定ファイルの絶対パス名を得る. | 
| String | absolutePath(String file_)指定ファイルの絶対パス名を得る. | 
| boolean | canExecute(File file_)指定ファイルが実行可能か調べる. | 
| boolean | canExecute(String fileName_)指定ファイルが実行可能か調べる. | 
| boolean | canRead(File file_)指定ファイルが読み込み可能か調べる. | 
| boolean | canRead(String fileName_)指定ファイルが読み込み可能か調べる. | 
| boolean | canWrite(File file_)指定ファイルが書き込み可能か調べる. | 
| boolean | canWrite(String fileName_)指定ファイルが書き込み可能か調べる. | 
| int | delete(File file_)指定ファイル/フォルダをdeleteする | 
| boolean | exists(File file_)指定ファイルが存在しているか調べる. | 
| boolean | exists(String fileName_)指定ファイルが存在しているか調べる. | 
| String | getCanonicalPath(File file_)指定ファイルの正式名を得る. | 
| String | getCanonicalPath(String fileName_)指定ファイルの正式名を得る. | 
| void | IO_message(String message_)セットされているメッセンジャーにメッセージを送る. | 
| boolean | isDirectory(File file_)指定ファイルがディレクトリか調べる. | 
| boolean | isDirectory(String fileName_)指定ファイルがディレクトリか調べる. | 
| boolean | isFile(File file_)指定ファイルがファイルか調べる. | 
| boolean | isFile(String fileName_)指定ファイルがファイルか調べる. | 
| boolean | isHidden(File file_)指定ファイルが隠しファイルか調べる. | 
| boolean | isHidden(String fileName_)指定ファイルが隠しファイルか調べる. | 
| long | lastModified(File file_)指定ファイルの最終変更時刻を得る. | 
| long | lastModified(String fileName_)指定ファイルの最終変更時刻を得る. | 
| String | parentPath(File file_)指定ファイルの親パス名を得る. | 
| String | parentPath(String fileName_)指定ファイルの親パス名を得る. | 
| RandomAccessFile | randomAccessFile(File file_,
                String mode_)RandomAccessFileを取得する(CANCEL可能) | 
| RandomAccessFile | randomAccessFile(String fileName_,
                String mode_)RandomAccessFileを取得する(CANCEL可能) | 
| void | setMessenger(hiIO.Messenger messenger_)メッセンジャーをセットする. | 
| <T> void | use(hiU.SupplierEx<T,Exception> open_,
   hiU.ConsumerEx<T,Exception> use_,
   Consumer<T> close_)CANCEL可能なラムダ機構 | 
| void | useRandomAccessFile(String fileName_,
                   String mode_,
                   hiU.BiConsumerEx<String,RandomAccessFile,Exception> func_)RandomAccessファイルをラムダ式で利用. | 
| void | useTextFileR(String fileName_,
            hiU.BiConsumerEx<String,BufferedReader,Exception> func_)テキスト入力ファイルをラムダ式で使用(CANCEL可). | 
| void | useTextFileR(String fileName_,
            long option_,
            hiU.BiConsumerEx<String,BufferedReader,Exception> func_)テキスト入力ファイルをラムダ式で使用(CANCEL可). | 
| void | useTextFileR(String fileName_,
            String charSet_,
            hiU.BiConsumerEx<String,BufferedReader,Exception> func_)テキスト入力ファイルをラムダ式で使用(CANCEL可). | 
| void | useTextFileR(String fileName_,
            String charSet_,
            long option_,
            hiU.BiConsumerEx<String,BufferedReader,Exception> func_)テキスト入力ファイルをラムダ式で使用(CANCEL可). | 
| void | useTextFileW(String fileName_,
            hiU.BiConsumerEx<String,PrintWriter,Exception> func_)テキスト出力ファイルをラムダ式で使用(CANCEL可). | 
| void | useTextFileW(String fileName_,
            long option_,
            hiU.BiConsumerEx<String,PrintWriter,Exception> func_)テキスト出力ファイルをラムダ式で使用(CANCEL可). | 
| void | useTextFileW(String fileName_,
            String charSet_,
            hiU.BiConsumerEx<String,PrintWriter,Exception> func_)テキスト出力ファイルをラムダ式で使用(CANCEL可). | 
| void | useTextFileW(String fileName_,
            String charSet_,
            long option_,
            hiU.BiConsumerEx<String,PrintWriter,Exception> func_)テキスト出力ファイルをラムダ式で使用(CANCEL可). | 
| void | whenCloseBR(BiConsumer<String,BufferedReader> whenClose_)BufferedReaderのクローズ直前に実行する手続き設定. | 
| void | whenClosed(Consumer<String> whenClosed_)クローズ直後に実行する手続き設定. | 
| void | whenClosePW(BiConsumer<String,PrintWriter> whenClose_)PrintWriterのクローズ直前に実行する手続き設定. | 
| void | whenCloseRA(BiConsumer<String,RandomAccessFile> whenClose_)RandomAccessFileのクローズ直前に実行する手続き設定. | 
| void | whenOpen(Consumer<String> whenOpen_)オープン直前に実行する手続き設定. | 
| void | whenOpenedBR(BiConsumer<String,BufferedReader> whenOpened_)PrintWriterのオープン成功時に実行する手続き設定. | 
| void | whenOpenedPW(BiConsumer<String,PrintWriter> whenOpened_)PrintWriterのオープン成功時に実行する手続き設定. | 
| void | whenOpenedRA(BiConsumer<String,RandomAccessFile> whenOpened_)RandomAccessFileのオープン成功時に実行する手続き設定. | 
cancel, cancel, check, doIt, doThis, doThis, isCanceled, reset, sleep, sleep, start, startactiveCount, checkAccess, countStackFrames, currentThread, destroy, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, resume, run, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, start, stop, stop, suspend, toString, yieldpublic void setMessenger(hiIO.Messenger messenger_)
messenger_ - セットするメッセンジャーpublic void IO_message(String message_)
message_ - メッセージpublic RandomAccessFile randomAccessFile(File file_, String mode_)
file_ - ファイルmode_ - モードpublic RandomAccessFile randomAccessFile(String fileName_, String mode_)
fileName_ - ファイル名mode_ - モードpublic boolean isDirectory(String fileName_)
fileName_ - ファイル名public boolean isDirectory(File file_)
file_ - ファイルpublic boolean isFile(String fileName_)
fileName_ - ファイル名public boolean isFile(File file_)
file_ - ファイルpublic boolean canExecute(String fileName_)
fileName_ - ファイル名public boolean canExecute(File file_)
file_ - ファイルpublic boolean canRead(String fileName_)
fileName_ - ファイル名public boolean canRead(File file_)
file_ - ファイルpublic boolean canWrite(String fileName_)
fileName_ - ファイル名public boolean canWrite(File file_)
file_ - ファイルpublic boolean exists(String fileName_)
fileName_ - ファイル名public boolean exists(File file_)
file_ - ファイルpublic boolean isHidden(String fileName_)
fileName_ - ファイル名public boolean isHidden(File file_)
file_ - ファイルpublic int delete(File file_)
file_ - ファイルpublic long lastModified(String fileName_)
fileName_ - ファイル名public long lastModified(File file_)
file_ - ファイルpublic String getCanonicalPath(String fileName_)
fileName_ - ファイル名public String getCanonicalPath(File file_)
file_ - ファイルpublic String absolutePath(File file_)
パスの区切りは"/"で返します。これはWindowsの "\"はJavaでは文字エスケープであり多くの混乱を 引き起こすためです。
file_ - ファイルRuntimeException - IOExceptionをcauseとして持つ。public String absolutePath(String file_)
パスの区切りは"/"で返します。これはWindowsの "\"はJavaでは文字エスケープであり多くの混乱を 引き起こすためです。
file_ - ファイル名RuntimeException - IOExceptionをcauseとして持つ。public String parentPath(String fileName_)
fileName_ - ファイル名public String parentPath(File file_)
file_ - ファイルpublic void whenOpen(Consumer<String> whenOpen_)
オープン・クローズと手続き呼び出しは次のタイミングで行われます。
   useXXX()
      --> whenOpen手続き    .accept(名前)
      オープン処理
      --> whenOpenedXX手続き.accept(名前,オープンされたファイル)
      --> func手続き
      --> whenCloseXX手続き .accept(名前,オープンされたファイル)
      クローズ処理
      --> whenClosed手続き  .accept(名前)
whenOpenとwhenClosedはファイル名のみが引き渡されます。
whenOpenedXXとwhenCloseXXはファイル名とオープンされたファイルが引き渡されます。
whenOpenedXXとwhenCloseのXXはファイル種を表します
(RA:RandomAccessFile,PW:PrintWriter,BR:BufferedReader)。
whenOpenとwhenClosedは全ファイル種共通です。
whenOpen_ - オープン直前に実行する手続きpublic void whenClosed(Consumer<String> whenClosed_)
whenClosed_ - クローズ直後に実行する手続きwhenOpen(Consumer)public void whenOpenedRA(BiConsumer<String,RandomAccessFile> whenOpened_)
whenOpened_ - オープン成功時に実行する手続きwhenOpen(Consumer)public void whenCloseRA(BiConsumer<String,RandomAccessFile> whenClose_)
whenClose_ - クローズ直前に実行する手続きwhenOpen(Consumer)public void useRandomAccessFile(String fileName_, String mode_, hiU.BiConsumerEx<String,RandomAccessFile,Exception> func_)
RandomAccessファイルをオープンし、ラムダ式を適用、クローズします。
次のように使うことができます。
    void foo(String fileName_,RandomeAccesFile file_)throws Exception{
       // ... ファイル読み込み処理
       }
    //...
       hiIO io=new hiIO();
       io.useRandomAccessFile(fileName_,"r",(_n_,_a_)->foo(_n_,_a_));
fileName_ - ファイル名mode_ - オープンモード r,rw,rws,rwdfunc_ - ラムダ式public void whenOpenedPW(BiConsumer<String,PrintWriter> whenOpened_)
whenOpened_ - オープン成功時に実行する手続きwhenOpen(Consumer)public void whenClosePW(BiConsumer<String,PrintWriter> whenClose_)
whenClose_ - クローズ直前に実行する手続きwhenOpen(Consumer)public void useTextFileW(String fileName_, String charSet_, long option_, hiU.BiConsumerEx<String,PrintWriter,Exception> func_)
PrintWriterをオープンし、ラムダ式を適用、クローズします。
hiFile.openTextFileW(String,String,long)のラムダ式+資源管理版です。
次のように使うことができます。
    void foo(String fileName_,PrintWriter pw_)throws Exception{
       // ... ファイル出力処理
       }
    //...
       hiIO io=new hiIO();
       io.useTextFileW(fileName_,"utf-8",hiU.APPEND,(_n_,_a_)->foo(_n_,_a_));
fileName_ - ファイル名charSet_ - 文字コードセットoption_ - オプション hiU.APPEND 追加モードfunc_ - ラムダ式public void useTextFileW(String fileName_, String charSet_, hiU.BiConsumerEx<String,PrintWriter,Exception> func_)
fileName_ - ファイル名charSet_ - 文字コードセットfunc_ - ラムダ式public void useTextFileW(String fileName_, long option_, hiU.BiConsumerEx<String,PrintWriter,Exception> func_)
fileName_ - ファイル名option_ - オプション hiU.APPEND 追加モードfunc_ - ラムダ式public void useTextFileW(String fileName_, hiU.BiConsumerEx<String,PrintWriter,Exception> func_)
fileName_ - ファイル名func_ - ラムダ式public void whenOpenedBR(BiConsumer<String,BufferedReader> whenOpened_)
whenOpened_ - オープン成功時に実行する手続きwhenOpen(Consumer)public void whenCloseBR(BiConsumer<String,BufferedReader> whenClose_)
whenClose_ - クローズ直前に実行する手続きwhenOpen(Consumer)public void useTextFileR(String fileName_, String charSet_, long option_, hiU.BiConsumerEx<String,BufferedReader,Exception> func_)
BufferedReaderをオープンし、ラムダ式を適用、クローズします。
hiFile.openTextFileR(String,String,long)のラムダ式+資源管理版です。
次のように使うことができます。
    void foo(String fileName_,BufferedReader pw_)throws Exception{
       // ... ファイル入力処理
       }
    //...
       hiIO io=new hiIO();
       io.useTextFileR(fileName_,"utf-8",hiU.APPEND,(_n_,_a_)->foo(_n_,_a_));
fileName_ - ファイル名charSet_ - 文字コードセットoption_ - オプション hiU.APPEND 追加モードfunc_ - ラムダ式public void useTextFileR(String fileName_, hiU.BiConsumerEx<String,BufferedReader,Exception> func_)
BufferedReaderをオープンし、ラムダ式を適用、クローズします。
hiFile.openTextFileR(String,String,long)のラムダ式+資源管理版です。
fileName_ - ファイル名func_ - ラムダ式public void useTextFileR(String fileName_, String charSet_, hiU.BiConsumerEx<String,BufferedReader,Exception> func_)
BufferedReaderをオープンし、ラムダ式を適用、クローズします。
hiFile.openTextFileR(String,String,long)のラムダ式+資源管理版です。
fileName_ - ファイル名charSet_ - 文字コードセットfunc_ - ラムダ式public void useTextFileR(String fileName_, long option_, hiU.BiConsumerEx<String,BufferedReader,Exception> func_)
BufferedReaderをオープンし、ラムダ式を適用、クローズします。
hiFile.openTextFileR(String,String,long)のラムダ式+資源管理版です。
fileName_ - ファイル名option_ - オプションfunc_ - ラムダ式public <T> void use(hiU.SupplierEx<T,Exception> open_, hiU.ConsumerEx<T,Exception> use_, Consumer<T> close_)
T - 資源の型open_ - オープンuse_ - 利用close_ - クローズ