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.IntThread
Thread.State, Thread.UncaughtExceptionHandler
MAX_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, start
activeCount, 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, yield
public 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_
- クローズ