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.Messenger
IO機構からのメッセージを受ける.
|
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_ - クローズ