Java java.nio.file.Files.isExecutable()メソッド
isExecutable()メソッドはjava.nio.file.Filesクラスの静的メソッドで、Java仮想マシンが指定されたファイルを実行する権限を持っているかどうかを確認します。
メソッド定義
public static boolean isExecutable(Path path)
パラメータ
path:チェックするファイルパス。型はjava.nio.file.Path
戻り値
boolean:ファイルが存在し実行可能な場合は、trueを返し、それ以外の場合はfalse
メソッドの詳細
機能説明
このメソッドは、JVMが指定されたファイルを実行するための十分な権限を持っているかどうかを確認します。注意すべき点:
- UNIXシステムでは、ファイルの実行権限ビットをチェックします
- Windowsシステムでは、すべてのファイルが「実行可能」と見なされるため、ファイルが存在する限り、メソッドは
true - ファイルが存在しないか、(権限不足により)アクセスできない場合、メソッドは
false
例外処理
このメソッドは以下の例外をスローする可能性があります:
SecurityException:セキュリティマネージャがインストールされており、ファイルへのアクセスが拒否された場合
使用例
基本例
例
import java.nio.file.*;
public class IsExecutableExample {
public static void main(String[] args) {
Path filePath = Paths.get("/usr/bin/ls"); // UNIXシステムでの ls コマンド
if (Files.isExecutable(filePath)) {
System.out.println("ファイルは実行可能です");
} else {
System.out.println("ファイルは実行不可または存在しません");
}
}
}
public class IsExecutableExample {
public static void main(String[] args) {
Path filePath = Paths.get("/usr/bin/ls"); // UNIXシステムでの ls コマンド
if (Files.isExecutable(filePath)) {
System.out.println("ファイルは実行可能です");
} else {
System.out.println("ファイルは実行不可または存在しません");
}
}
}
クロスプラットフォーム例
例
import java.nio.file.*;
public class CrossPlatformExample {
public static void main(String[] args) {
// Windowsの例
Path windowsExe = Paths.get("C:\\Windows\\System32\\cmd.exe");
// Linux/macOSの例
Path unixScript = Paths.get("/usr/local/bin/myscript.sh");
checkExecutable(windowsExe);
checkExecutable(unixScript);
}
private static void checkExecutable(Path path) {
System.out.println("チェック: " + path);
System.out.println("実行可能: " + Files.isExecutable(path));
System.out.println("存在: " + Files.exists(path));
System.out.println();
}
}
public class CrossPlatformExample {
public static void main(String[] args) {
// Windowsの例
Path windowsExe = Paths.get("C:\\Windows\\System32\\cmd.exe");
// Linux/macOSの例
Path unixScript = Paths.get("/usr/local/bin/myscript.sh");
checkExecutable(windowsExe);
checkExecutable(unixScript);
}
private static void checkExecutable(Path path) {
System.out.println("チェック: " + path);
System.out.println("実行可能: " + Files.isExecutable(path));
System.out.println("存在: " + Files.exists(path));
System.out.println();
}
}
実際の適用シーン
シーン1:スクリプトの実行可能性の検証
外部スクリプトやプログラムを実行する前に、それが実行可能かどうかを事前に検証します:
例
public void runScript(Path scriptPath) throws IOException {
if (!Files.isExecutable(scriptPath)) {
throw new IOException("スクリプトは実行不可: " + scriptPath);
}
// スクリプトを実行するロジック
ProcessBuilder pb = new ProcessBuilder(scriptPath.toString());
pb.start();
}
if (!Files.isExecutable(scriptPath)) {
throw new IOException("スクリプトは実行不可: " + scriptPath);
}
// スクリプトを実行するロジック
ProcessBuilder pb = new ProcessBuilder(scriptPath.toString());
pb.start();
}
シーン2:セキュリティチェック
セキュリティ要件が高いアプリケーションでは、ファイルの実行可能性のチェックをセキュリティ検証の一部として使用できます:
例
public boolean isSafeToExecute(Path filePath) {
return Files.isRegularFile(filePath) &&
Files.isReadable(filePath) &&
Files.isExecutable(filePath);
}
return Files.isRegularFile(filePath) &&
Files.isReadable(filePath) &&
Files.isExecutable(filePath);
}
注意事項
- プラットフォームの違い:前述のとおり、WindowsとUNIXシステムでは、このメソッドの実装に顕著な違いがあります
- シンボリックリンク:パスがシンボリックリンクを指している場合、リンク先の実行可能性がチェックされます
- パフォーマンスに関する考慮事項:このメソッドを頻繁に呼び出すとパフォーマンスに影響する可能性があるため、必要に応じて結果をキャッシュできます
- セキュリティ制限:セキュリティマネージャが存在する場合、このメソッドを呼び出すには追加の権限が必要になることがあります
まとめ
Files.isExecutable()はシンプルですが実用的なメソッドであり、ファイルの実行可能性を検証する必要があるシーンに特に適しています。異なるプラットフォームでの動作の違いを理解することは、クロスプラットフォームコードを書く上で非常に重要です。実際のアプリケーションでは、通常このメソッドを他のファイルチェックメソッド(例:exists()、isRegularFile()など)と組み合わせて使用し、包括的な検証を行います。
Java java.nio.file.Files