質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

JAVAでのファイル操作に関するアクセス権について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,858

matukaze

score 13

お世話になっております。

以下の事象により困っています。
わかる方がいましたら、ご教示願います。

■やりたいこと
javaで指定したファイルの文字列Aを文字列Bに置換したい

■問題点
ローカルでは問題なくファイル操作できるが、
本番環境ではアクセス権の問題でファイル操作できない。

■環境
ローカル・本番ともにwindows

■現状の解決策
java.io.FilePermissionクラスを使用して
書き込み権限を与え、ファイル操作する

■ソース

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilePermission;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileReplacer {

    public static int strReplace(String file_name, String before_str, String after_str){

        int err_code = 0;
        try {
            FilePermission perm = new java.io.FilePermission(file_name, "write");

            //置換対象ファイル読込
            File file = new File(file_name);
            String strReadText = null;
            StringBuffer sbWriteText = new StringBuffer();

            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);

            //ファイルを読込んで指定文字を置き換える。
            while((strReadText = br.readLine()) != null) {
                    strReadText= strReadText.replaceAll(before_str,after_str);

                sbWriteText.append(strReadText);
                sbWriteText.append("\r\n");
            }

            //置き換えた文字列でファイルを置き換える。
            FileWriter fw = new FileWriter(file);
            fw.write(sbWriteText.toString());

            fw.close();
            fr.close();
        }catch(FileNotFoundException e){
            e.printStackTrace();
            err_code = 1;
        }catch(IOException e){
            e.printStackTrace();
            err_code =1;
        }
        return err_code;
    }
}

■わからないこと
FilePermission perm = new java.io.FilePermission(file_name, "write");
を追記して、指定ファイルの書き込み権限を付与?してみましたが、
ここからどのように
File file = new File(file_name);
につなげるかがわかりません。
もしくは他のやり方があればご教示願います。

説明不足かもしれませんが、ご回答よろしくお願いいたします。

//追記(備忘)
java.policyファイルをいじらないとダメ?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2017/05/22 18:41

    質問編集画面でコードの部分を反転選択し、画面上部にある<code>を押してください。インデントも表示され、コードが読みやすくなります。

    キャンセル

  • matukaze

    2017/05/23 09:36

    >>swordone様 ご指摘ありがとうございます。いまいち使い方が分かっておりませんでしたが、参考になりました。

    キャンセル

回答 2

checkベストアンサー

+1

FilePermissionクラスは権限を付与するためにあるのではなく、制限するためにあります。
OS環境によりファイル操作権限が与えられていないならそれはJavaプログラム側で何をやっても権限を得ることはできません(できてしまったらそれはWindowsの欠陥です)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/23 09:43

    >>yuba様
    ご回答ありがとうございます。
    なるほど・・・FilePermissionクラスは権限付与ではなく制限するためにあるのですね。
    ちなみに、java.policyファイルに追記しても無意味ということでしょうか?
    もしくはjavaが問答無用でアクセスできるファルダがあったりするのでしょうか。

    キャンセル

  • 2017/05/23 10:00

    Windowsのファイル権限は、プログラムに対してでなくユーザーに対して与えられています。
    なので、「Javaがアクセスできるフォルダ」ではなく「実行ユーザーがアクセスできるフォルダ」であるかどうかだけが問題となります。
    そのファイル、Java以前にまずTYPEコマンドでアクセスできますか?

    キャンセル

  • 2017/05/23 18:28

    >>yuba様
    お返事遅くなり申し訳ございません。
    仰る通り、ファイルの権限を確認してみましたところ、該当ユーザに対するアクセス権がありませんでした。
    なんとか解決できましたので、事故解決欄に詳細を記載いたします。
    ありがとうございました!

    キャンセル

0

解決できましたのでご報告いたします。
説明が抜けておりまして、申し訳ございませんでした・・・

■問題詳細
①置換対象ファイルについて
こちらはMYSQLでselectの結果を出力したファイルです。

②上記ファイルに対して、javaからアクセスしようとした際に
ユーザに対するアクセス権限がないという問題でした。

■結論
「①のユーザと②のユーザが一致していなく、
①のファイルに対する②のアクセス権がUSERS扱いになり、
USERSには書き込み権限がなかった」
ということでした。

■対策
②のユーザでは①のファイルを読み取ることは出来るので、
同じく②のユーザで別のファイル※1を作成し、それに書き込むことにしました。
(※1:下記ソースのfile_name2に該当します)

■ソース

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileReplacer {

    public static int strReplace(String file_name1, String file_name2, String before_str, String after_str){

        int err_code = 0;
        try {

            //置換対象ファイル読込
            File file = new File(file_name1);
            String strReadText = null;
            StringBuffer sbWriteText = new StringBuffer();

            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);

            //ファイルを読込んで指定文字を置き換える。
            while((strReadText = br.readLine()) != null) {
                strReadText= strReadText.replaceAll(before_str,after_str);

                sbWriteText.append(strReadText);
                sbWriteText.append("\r\n");
            }

            //置き換えた文字列でファイルに出力。
            File file2 = new File(file_name2);
            FileWriter fw = new FileWriter(file2);
            fw.write(sbWriteText.toString());

            fw.close();
            fr.close();
        }catch(FileNotFoundException e){
            e.printStackTrace();
            err_code = 1;
        }catch(IOException e){
            e.printStackTrace();
            err_code =1;
        }
        return err_code;
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る