Java コードを使用して、画像ファイルに許可モード値「777」を付与したいと考えています。Javaを使用してそれを与えるにはどうすればよいですか? デフォルトの許可モード「664」では画像を削除できないためです。
5 に答える
残念ながら、Java はシステム ファイルのプロパティをほとんど取得できません。これは、Java の「一度書き込み、どこでも実行する」という黄金律を破るからです。
実際、ファイルへのアクセスを 777 にしたいと書いた場合、それは明らかに unix を使用していることを意味します。しかし、たとえば Windows では、そのような要求は何を意味するのでしょうか?
したがって、特定の OS トピックに対処するには、特定の関数を使用する必要があることは驚くべきことではありません。これは、(強い理由で) 「プラットフォームに依存しない」と主張する言語を使用する場合に支払う代償です。
より安全な方法は、必要なものを正確に実装する JNI ライブラリを使用することです。シンプルだが汚い危険な方法は、Runtime.getRuntime().exec("chmod 777 myFile") を使用することです。
なぜ危険なのですか?実際、そのような exec("blahblah") を呼び出すとどうなりますか?
Java プログラムを実行している UNIX プロセスがフォークします。次に、「複製された」プロセスがシェルを実行し(ksh?csh?bash??UNIX構成に依存します)、「何とか」文を理解して実行しようとします。
jvm が実際に 500 MB を使用している場合、フォークされたプロセスは開始時に同じサイズになります...
次に、シェルは Java プロセスと同じ「シェル コンテキスト」、つまり同じ PATH、エイリアスなどで開始します。「chmod」でさえエイリアス化されている可能性があるため、chmod のフル パスを呼び出す方がよいでしょう (/bin/chmod、/usr/bin/chmod... unix フレーバーに依存します...)。
シェルの実行中に Java プログラムがフリーズし、何らかの理由でシェルがハングした場合にフリーズを解除する方法がありません。
そして最後に、Java プログラムの UNIX 所有者が、ファイルのそのような情報を変更するのに十分な権限を持っているかどうかさえ定かではありません (たとえば、ファイルの作成は許可されても、ユーザー レベルの権限を変更することは許可されない可能性があります)。
OS レベルで対処すべき問題を Java レベルで処理しようとしているのではないでしょうか。
コードは次のとおりです。-
List<String> chPermList = new LinkedList<String>();
chPermList.add("/bin/chmod");
chPermList.add("777");
chPermList.add(Path_to_image_file);
public void changePermission(List chPermList)
{
ProcessBuilder pb = null;
pb = new ProcessBuilder(chPermList);
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p
.getInputStream()));
p.waitFor();
if(p.exitValue()!=0)
{
strExpMsg = "The permission change failed with exit value" + p.exitValue();
}
}