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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

19420閲覧

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

matukaze

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/05/22 08:20

編集2017/05/23 00:10

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

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

■やりたいこと
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ファイルをいじらないとダメ?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/05/22 09:41

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

2017/05/23 00:36

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

回答2

0

ベストアンサー

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

投稿2017/05/22 10:27

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matukaze

2017/05/23 00:43

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

2017/05/23 01:00

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

2017/05/23 09:28

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

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; } }

投稿2017/05/23 09:46

matukaze

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問