7.

java.io.FileNotFoundException 許可がありません の原因と対処

編集
この記事の要点
  • java.io.FileNotFoundException: ファイル名 (許可がありません)ファイルへのアクセス権限がない
  • メッセージは「ファイルがない」のように見えるが、実体は権限エラー
  • 対処 ①: chmod / chown でファイル権限を修正
  • 対処 ②: アプリ実行ユーザを確認(root か / tomcat か / appuser か)
  • Linux/Mac は ls -l で権限確認、Windows はプロパティ → セキュリティ

 

エラーの状況

java.io.FileNotFoundException: /var/log/app.log (許可がありません)
    at java.base/java.io.FileOutputStream.open0(Native Method)
    at java.base/java.io.FileOutputStream.open(FileOutputStream.java:298)
    at java.base/java.io.FileOutputStream.(FileOutputStream.java:237)

# 英語環境
java.io.FileNotFoundException: /var/log/app.log (Permission denied)

メッセージは「FileNotFoundException」ですが、ファイル自体は存在するのに「権限がない」状態。Java の例外設計の歴史的事情で、権限エラーもこのクラスで返ります。

原因と対処

原因 1: 読み取り権限がない

# 権限確認
$ ls -l /path/to/file
-rw------- 1 root root 1024 May 15 12:00 /path/to/file
#       ↑ owner だけが r/w 可能、appuser からは読めない

# 対処: 権限付与
$ sudo chmod 644 /path/to/file    # owner rw, others r
$ sudo chmod o+r /path/to/file    # others に読み権限追加

# または owner を変更
$ sudo chown appuser:appuser /path/to/file

原因 2: 書き込み権限がない

# Java が書き込もうとしているディレクトリ・ファイルを確認
$ ls -ld /var/log/myapp
drwxr-xr-x 2 root root 4096 May 15 12:00 /var/log/myapp/
# → root だけが書ける、tomcat ユーザは書けない

# 対処
$ sudo chown tomcat:tomcat /var/log/myapp
$ sudo chmod 755 /var/log/myapp

# または共有グループに
$ sudo chgrp -R appgroup /var/log/myapp
$ sudo chmod g+w /var/log/myapp

原因 3: ディレクトリの実行 (x) 権限がない

ファイルを開くには、そのファイルが属する全パスに対する実行権限 (x) が必要:

# /home/admin/private/file.txt を開きたい場合
$ ls -ld /home /home/admin /home/admin/private
drwxr-xr-x  /home
drwx------  /home/admin       ← appuser は admin 配下に入れない (x なし)
drwxr-xr-x  /home/admin/private

# 対処: 中間ディレクトリに x を付与
$ sudo chmod o+x /home/admin

原因 4: アプリ実行ユーザの権限不足

# 実行中の Java プロセスのユーザを確認
$ ps -o user,pid,command -p 
USER       PID COMMAND
tomcat    1234 /usr/bin/java -jar /opt/app.jar

# tomcat ユーザでアクセスしたいファイル
$ ls -l /var/lib/myapp/data
-rw------- 1 root root 1024 ... data
# tomcat には読めない

# 対処
$ sudo chmod 644 /var/lib/myapp/data
# または owner を tomcat に
$ sudo chown tomcat:tomcat /var/lib/myapp/data

原因 5: SELinux でブロックされている (RHEL/CentOS)

# SELinux ステータス確認
$ getenforce
Enforcing

# 該当ファイルのコンテキスト
$ ls -Z /var/log/app.log
unconfined_u:object_r:default_t:s0  /var/log/app.log

# Tomcat 等が書ける tomcat_log_t に変更
$ sudo chcon -t tomcat_log_t /var/log/app.log
# 永続化
$ sudo semanage fcontext -a -t tomcat_log_t "/var/log/app.log"
$ sudo restorecon -v /var/log/app.log

# 一時的に SELinux を緩める (デバッグ用)
$ sudo setenforce 0  # Permissive
# 問題なければ原因は SELinux

# 拒否ログ確認
$ sudo ausearch -m AVC -ts recent

原因 6: Windows のセキュリティ

  • ファイル右クリック → プロパティ → セキュリティタブ
  • 「グループ名またはユーザー名」に実行ユーザがあるか
  • 「アクセス許可」で読み取り・書き込みが許可されているか
  • 編集 → 追加 → ユーザを追加 → 必要な権限にチェック

原因 7: ファイルが他プロセスでロックされている (Windows)

Windows ではファイルが他プロセスに開かれていると排他的にロックされ、Java からアクセスできなくなることがあります:

# Windows: どのプロセスがファイルを使用中か
> handle.exe -p path\to\file  # Sysinternals
# または Resource Monitor (resmon) → CPU → 関連付けられたハンドル

権限の見方

$ ls -l file.txt
-rw-r--r-- 1 alice users 1024 May 15 12:00 file.txt
^^^^^^^^^^
 │└─ "rw-" "r--" "r--"
 │     │     │     │
 │     │     │     └ others (rwx の有無)
 │     │     └─ group の権限
 │     └─ owner の権限
 └ ファイル種別 (-:通常, d:ディレクトリ, l:シンボリックリンク)

# 数値表現 (8 進数)
# r=4, w=2, x=1
# 644 = rw- r-- r-- (owner=6, group=4, others=4)
# 755 = rwx r-x r-x
# 777 = rwx rwx rwx (危険、避ける)

権限の典型的な設定値

用途権限備考
一般ファイル644owner rw, others r
機密ファイル600owner のみ
実行可能ファイル755owner rwx, others rx
ディレクトリ755標準
共有書き込みディレクトリ775 + sticky bit (g+s)グループ共有
Web 公開ファイル644owner rw, others r (Nginx/Apache が読める)
パスワードファイル600 / 640絶対に others へ読み権限を渡さない

関連エラー

  • FileNotFoundException: ... (No such file or directory): 本当にファイルがない
  • AccessDeniedException: NIO の権限エラー(Java 7+)
  • SecurityException: Java の SecurityManager がブロック
  • IOException: Stale NFS file handle: NFS マウントの異常
  • IOException: Read-only file system: ファイルシステムが ro でマウント

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. java.lang.NoSuchMethodError
  2. java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
  3. java.lang.UnsupportedClassVersionError
  4. version less than X.X is not supported.
  5. パッケージ~は存在しません
  6. org.apache.jasper.JasperException: ...The jsp:param action must not be...
  7. java.io.FileNotFoundException: ファイル名 (許可がありません)
  8. java.sql.SQLException: Cannot convert value 'YYYY-MM-DD ...' from column n(YYYY-MM-DD ...) to TIMESTAMP.
  9. 警告: この文字は、エンコーディング[文字コード]にマップできません
  10. java.text.ParseException: Unparseable date
  11. Unsupported major.minor version 52.0
  12. エンティティ" ... "への参照は';'デリミタで終了する必要があります。
  13. java.math.BigDecimal cannot be cast to java.lang.String