タイトル: java.io.FileNotFoundException: ファイル名 (許可がありません)
SEOタイトル: java.io.FileNotFoundException 許可がありません の原因と対処
| この記事の要点 |
|---|
|
エラー内容
| java.io.FileNotFoundException: ファイル名 (許可がありません) |
Javaで FileInputStream や FileOutputStream、Files.newInputStream 等でファイルを開こうとしたときに、実行ユーザーに読み取り(または書き込み)の権限がない場合に発生する例外です。メッセージ末尾が「(許可がありません)」になっているのが目印で、「ファイルが存在しない」エラーとは別物です。
発生条件 / 原因
- 対象ファイルまたは親ディレクトリの読み取り・書き込み権限がプロセスユーザーに無い
- 対象が他ユーザー所有で、グループ・other に権限が付与されていない
- 書き込み先のディレクトリ自体に書き込み権限が無い(新規ファイル作成時)
- SELinux や AppArmor などで遮断されている
- Webサーバー(apache/nginx/tomcat ユーザー)から実行しており、開発者ユーザーとは異なる
対処法
1. 現在の権限と所有者を確認する
| $ ls -l /path/to/file |
所有者・グループ・パーミッション(rwxrwxrwx) を確認します。
2. 実行ユーザーを確認する
| $ whoami $ id |
3. 権限を付与する
所有者を実行ユーザーに変更する場合:
| $ sudo chown 実行ユーザー /path/to/file |
読み取りだけ付与する場合:
| $ chmod +r /path/to/file |
書き込みも必要なら:
| $ chmod u+rw /path/to/file |
4. 親ディレクトリの実行権限を確認
ファイルにアクセスするには、親ディレクトリにも実行(x)権限が必要です。
| $ ls -ld /path/to/ |
注意点
- 本番環境ではむやみに 777 にせず、必要最小限の権限で付与する
- Webサーバー経由(servlet/jsp/Tomcat等)の場合は、Webサーバープロセスのユーザー権限であることが多い
- Windows環境では「アクセスが拒否されました」(Access is denied) と表示されることがあるが、本質は同じパーミッション問題
- 本当にファイルが存在しない場合は、メッセージが「(そのようなファイルやディレクトリはありません)」になる