|
|
ファイルを管理する |
H.Kamifuji . |
ローカルディスクにあるファイルをJavaで管理する方法について解説します。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
Javaではファイルを扱うにはFileクラスを使います。まずはFileクラスについて見てみましょう。 まずは取り扱いたいファイルに対して1つのFileクラスのオブジェクトを対応させます。どのファイルを対象としているかを特定するには、ファイルが置いてある場所(ディレクトリ)とファイルの名前が必要になります。まずは絶対パスでファイル名を指定してみましょう。 File オブジェクト名 = new File(ファイル名) 対象とするファイル名をディレクトリの位置+ファイル名の形で指定します。例えば下記のようになります。 File file = new File("c:\\tmp\\test.txt");※Windowsの場合です。 これで「Cドライブ」にある「tmp」というディレクトリの中にある「test.txt」というファイルに対して、Fileクラスのオブジェクトである「file」を対応させました。例えば今後このファイルの内容を読み込んだり書き込んだりする場合に、先ほど作成したFileクラスの「file」オブジェクトを使って行うことができるようになりました。つまりFileクラスを使うことで、ローカルディスクにあるファイルをJavaで扱えるようにしてくれるわけです。 ちなみにファイル名を指定する時に、「c:\tmp\test.txt」ではなく「c:\\tmp\\test.txt」のように「\」を2つ重ねて記述します。これは文字列の中で「\」は特別な意味を持つ単語のため、特別な意味ではなく単なる「\」ですということを意味するため「\」を2つ重ねて「\\」と記述します。 UNIX の場合は、 File file = new File("./tmp/test.txt");のように、ディレクトリの区切りには、「/」を利用します。Windows でも fopen など処理系では、「/」が利用できるようです。 絶対指定と相対指定先ほどはファイルの場所をドライブの位置からの絶対指定で記述しました。ファイルの指定には絶対指定だけではなく、相対位置での指定も可能です。相対位置の場合は、このプログラムを記述しているJavaのファイルが置かれている位置を基準とします。例えばプログラムファイルと同じディレクトリに対象のファイルがある場合には、下記のように記述します。 File file = new File("test.txt");またプログラムファイルのディレクトリの中に「txt」というディレクトリがあり、そのディレクトリに対象のファイルがある場合には、下記のように記述します。 File file = new File(".\\txt\\test.txt");UNIX の場合は、下記のように記述します。 File file = new File("./txt/test.txt"); ファイルとディレクトリJavaではファイルもディレクトリも同じものとして扱います。つまりディレクトリも1つのFileクラスのオブジェクトとして扱うことが出来ます。例えば「Cドライブ」にある「tmp」というディレクトリをJavaで取り扱うためには下記のように記述します。 File file = new File("c:\\tmp\\");では簡単なサンプルをひとつ試してみます。Fileクラスには"list"というメソッドを使うことでFileクラスのオブジェクトに含まれるファイルやディレクトリの一覧を取得することができます。Fileクラスのオブジェクトをファイルに割り当てた場合には出来ませんけど、ディレクトリに割り当てた場合、そのディレクトリの中にはファイルやサブディレクトリが含まれていると思います。その一覧を取得できるわけです。 下記のサンプルでは「Cドライブ」のルートディレクトリ(つまりC:\のことです)に含まれるファイルやディレクトリ一覧を取得しています。(listメソッドの使い方は次のページ以降で詳しく見てみます)。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; class fileTest1{ public static void main(String args[]){ // File cdirectory = new File("c:\\"); File cdirectory = new File("./"); String filelist[] = cdirectory.list(); for (int i = 0 ; i < filelist.length ; i++){ System.out.println(filelist[i]); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd File]$ java fileTest1 fileTest1.class fileTest2.class fileTest2.java fileTest3.class fileTest3.java 省略 ww04.txt ww05.txt ww06.txt ww07.txt [xxxxxxxx@dddddddddd File]$Linux の Gnome で動作させています。「 ./ 」カレントディレクトリのファイル・リストを表示義弟ます。 |
前項のページのサンプルで、ディレクトリに含まれるファイルとディレクトリの一覧を取得してみましたが、取得した一覧に含まれるものがファイルなのかディレクトリなのかが見た目では分かりません。そこで、ここではディレクトリとファイルの区別をする方法を見てみましょう。 まずは前項のページのサンプルで使ったFileクラスで用意されている"list"メソッドについて見てみます。 list public String[] list()この抽象パス名が示すディレクトリにあるファイルおよびディレクトリを示す文字列の配列を返します。 この抽象パス名がディレクトリを示さない場合、このメソッドは null を返します。ディレクトリを示す場合は、文字列の配列が返されます。文字列は、ディレクトリ内の各ファイルまたはディレクトリごとに 1 つです。そのディレクトリ自体およびその親のディレクトリを示す名前は結果に含まれません。各文字列は、絶対パスではなくファイル名です。 結果の配列の名前文字列は特定の順序にはなりません。アルファベット順になるわけではありません。 戻り値: この抽象パス名が示すディレクトリにあるファイルおよびディレクトリを示す文字列の配列。ディ レクトリが空の場合、配列は空になる。この抽象パス名がディレクトリを示さない場合、または 入出力エラーが発生した場合は null 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkRead(java.lang.String) メソッドがディレクトリへの読み込みアクセス を許可しない場合 簡単に書くと、作成したFileクラスのオブジェクトに対してこの"list"メソッドを使った場合、Fileクラスオブジェクトの元になっているものがディレクトリだった場合は、そのディレクトリに含まれるファイル名の一覧を文字列型の配列にして返してくれます。 前項のサンプルでは、カレントディレクトリからFileクラスのオブジェクトを作成しましたので、そのディレクトリに含まれるファイルとディレクトリの一覧を表す文字列の配列を取り出す事が出来ました。 今回は取り出したファイルとディレクトリの一覧を、ディレクトリなのかファイルなのかを判別する必要があります。この判定するためのメソッドもFileクラスで用意されているのですが、先ほどの"list"メソッドではファイルの一覧を名前だけ文字列で取得するので、この取り出した名前からまた1つ1つFileクラスのオブジェクトを作成し判定していかなければなりません。 そこで、今回はファイルやディレクトリの名前の一覧を取得するのではなく、ディレクトリに含まれるファイルやディレクトリをFileクラスのオブジェクトの一覧として取得できる"listFiles"メソッドを使ってみます。このメソッドもFileクラスで用意されています。 stFiles public File[] listFiles()この抽象パス名が示すディレクトリ内のファイルを示す抽象パス名の配列を返します。 この抽象パス名がディレクトリを示さない場合、このメソッドは null を返します。ディレクトリを示す場合、File オブジェクトの配列が返されます。File オブジェクトは、ディレクトリ内の各ファイルまたはディレクトリごとに 1 つです。ディレクトリ自体およびその親のディレクトリを示すパス名は結果に含まれません。結果の各抽象パス名は、File(File, String)コンストラクタを使用することにより、この抽象パス名から生成されます。そのため、このパス名が絶対の場合、結果の各パス名は絶対です。このパス名が相対の場合、結果の各パス名は同じディレクトリに対して相対です。 結果の配列の名前文字列は特定の順序にはなりません。アルファベット順になるわけではありません。 戻り値: この抽象パス名が示すディレクトリ内のファイルおよびディレクトリを示す抽象パス名の配列。配 列は、ディレクトリが空の場合は空になる。この抽象パス名がディレクトリを示さない場合、ま たは入出力エラーが発生した場合は null 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkRead(java.lang.String) メソッドがディレクトリへの読み込みアクセス を許可しない場合 このメソッドは基本的に"list"メソッドと同じなのですが、一覧をFileクラスのオブジェクトとして返してくれます。使い方は下記のようになります。 File directory = new File("c:\\"); File[] filelist = directory.listFiles();これであるディレクトリに含まれるファイルとディレクトリの一覧を、Fileクラスのオブジェクトの配列として取得することが出来ました。 ファイルとディレクトリの判別次に1つ1つのFileクラスのオブジェクトがファイルなのかディレクトリなのかを判別します。Fileクラスで用意されている"isFile"メソッドは、対象のFileクラスのオブジェクトがファイルだった場合にTrueを返してくるメソッドです。同じように"isDirectory"メソッドは対象のFileクラスのオブジェクトがディレクトリだった場合にTrueを返してくるメソッドです。isFileメソッド: isFile public boolean isFile()この抽象パス名が示すファイルが普通のファイルかどうかを判定します。ファイルは、それがディレクトリではなく、システムに依存するほかの基準を満たす場合に「普通」のファイルと見なされます。Java アプリケーションが生成したディレクトリ以外のファイルは、必ず普通のファイルです。 戻り値: この抽象パス名が示すファイルが存在し、さらにそれが普通のファイルである場合は true、そう でない場合は false 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkRead(java.lang.String) メソッドがファイルへの読み込みアクセスを許 可しない場合 isDirectoryメソッド: isDirectory public boolean isDirectory()この抽象パス名が示すファイルがディレクトリであるかどうかを判定します。 戻り値: この抽象パス名が示すファイルが存在し、さらにそれがディレクトリで ある場合は true、そうでない場合は false 例外: SecurityException - セキュリティマネージャが存在し、セキュリティ マネージャの SecurityManager.checkRead(java.lang.String) メソッド がファイルへの読み込みアクセスを許可しない場合 このメソッドを使って判別していきます。具体的には下記のようになります。 File directory = new File("c:\\"); File[] filelist = directory.listFiles(); for (int i = 0 ; i < filelist.length ; i++){ if (filelist[i].isFile()){ // ファイルだった時の処理 }else if (filelist[i].isDirectory()){ // ディレクトリだった時の処理 } }また前のサンプルとは違ってファイル名やディレクトリの一覧を文字列としてではなくFileクラスのオブジェクトの配列として取得しているので、ファイル名又はディレクトリ名を画面に表示するときにはFileクラスで用意されている"getName"メソッドを使ってFileクラスのオブジェクトからファイル名又はディレクトリ名を取り出して表示します。 getName public String getName()この抽象パス名が示すファイルまたはディレクトリの名前を返します。これは、パス名の名前シーケンスの最後の名前です。パス名の名前シーケンスが空の場合、空の文字列が返されます。 戻り値: この抽象パス名が示すファイルまたはディレクトリの名前。このパス名の名前シーケンスが空の場 合は空の文字列 では試してみます。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; class fileTest2{ public static void main(String args[]){ // File cdirectory = new File("c:\\"); File cdirectory = new File("./"); File filelist[] = cdirectory.listFiles(); for (int i = 0 ; i < filelist.length ; i++){ if (filelist[i].isFile()){ System.out.println("[F]" + filelist[i].getName()); }else if (filelist[i].isDirectory()){ System.out.println("[D]" + filelist[i].getName()); }else{ System.out.println("[?]" + filelist[i].getName()); } } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd File]$ java fileTest2 [F]fileTest1.class [F]fileTest2.class [F]fileTest3.class [F]fileTest3.java [F]fileTest4.class [F]fileTest4.java [F]fileTest5.class [F]fileTest5.java [F]fileTest8.class [F]fileTest8.java [F]fileTest9.class [F]fileTest9.java [F]fileTest10.class [F]fileTest10.java [F]newfile.txt [D]sub [F]test.txt [F]ww00.txt [F]ww01.txt [F]ww02.txt [F]ww03.txt [F]ww04.txt [F]ww05.txt [F]ww06.txt [F]ww07.txt [xxxxxxxx@dddddddddd File]$今回はファイルだったら先頭に[F]を、ディレクトリだったら先頭に[D]を付けて表示させてみました。どちらにも該当しないものは[?]を付けてあります。 |
ファイルのディレクトリの位置まで含めたファイルの名前を取得してみましょう。前のページで使った"getName"メソッドはファイルの名前だけを取得できました。Fileクラスで用意されている"getAbsolutePath"メソッドは絶対パスによるファイルの位置と名前を取得できます。 getAbsolutePath public String getAbsolutePath()この抽象パス名の絶対パス名文字列を返します。 この抽象パス名がすでに絶対である場合、パス名文字列は getPath() メソッドのように簡単に返されます。この抽象パス名が空の抽象パス名の場合、現在のユーザディレクトリ (システムプロパティuser.dir で示される) のパス名文字列が返されます。そうでない場合、このパス名はシステムに依存する方法で解決されます。UNIX システムの場合、相対パス名は現在のユーザディレクトリを基準に解決することで絶対になります。Microsoft Windowsシステムの場合、相対パス名はパス名で示されたドライブの現在のディレクトリがある場合は、それを基準に解決することで絶対になります。ない場合は、現在のユーザディレクトリを基準に解決されます。 戻り値: この抽象パス名と同じファイルまたはディレクトリを示す絶対パス名文字列 例外: SecurityException - 必須のシステムプロパティの値にアクセスできない場合 このメソッドを実行すると絶対パスによるファイルの情報を取得できます。 では簡単なサンプルで試してみます。「C:\tmp」ディレクトリに「test.txt」という名前のファイルを用意します。そしてJavaのサンプルプログラムも同じディレクトリに設置し、相対パスで指定した「test.txt」からFileクラスのオブジェクトを作成し、絶対パスでの位置と名前を取得してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; class fileTest3{ public static void main(String args[]){ File file = new File("test.txt"); String path = file.getAbsolutePath(); System.out.println("File:" + path); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd File]$ java fileTest3 File:/home/yyyyyyyyyy/JSupport/JAVA_Start/File/test.txt [wwwadmin@kamifuji18 File]$ |
今までは既にあるファイルに対しての操作でしたが、今後は新しいファイルを作成してみます。Fileクラスで用意されている"createNewFile"メソッドを使います。 createNewFile public boolean createNewFile() throws IOExceptionこの抽象パス名が示す空の新しいファイルを不可分 (atomic) に生成します(そのファイルがまだ存在しない場合だけ)。ファイルがあるかどうかのチェックや、ない場合のファイルの生成は、そのファイルに影響を与える可能性のあるほかのすべてのファイルシステムの処理に対して不可分である単一のオペレーションです。 戻り値: 指定されたファイルが存在せず、ファイルの生成に成功した場合は true、示されたファイルがす でに存在する場合は false 例外: IOException - 入出力エラーが発生した場合 SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkWrite(java.lang.String) メソッドがファイルへの書き込みアクセスを 許可しない場合 作成しようとする新しいファイルが既に存在している場合は作成できません。 では作成方法を順を追って見ていきます。まずは作成しようとするファイル名でFileクラスのオブジェクトを作成します。 File newfile = new File("./tmp/newfile.txt");上記では作成するファイルを相対パスで指定していますが、今までのように絶対パスで指定しても構いません。 次に作成したFileクラスのオブジェクトに対して"createNewFile"メソッドを実行します。 File newfile = new File("./tmp/newfile.txt"); newfile.createNewFile();基本的には以上なのですが、"createNewFile"メソッドを使う場合には"IOException"という例外が発生する可能性があります。 例外と言うのはいずれ詳しく見ていきますが、簡単に書くとプログラムを実行中に発生する可能性があるエラーのことです。文法的に間違ったプログラムの場合は、コンパイルの時にエラーが表示されますが、文法的には間違っていなくてもプログラムの実行中に起こるエラーを例外といいます。 実行時にエラーが発生するとプログラムが強制終了してしまいます。いきなり強制終了すると困る場合がありますので、プログラムの実行中にエラーが発生した場合に強制終了させず、エラーが発生した時の処理を記述しておくことが出来ます。 実行時のエラーはこのメソッドに限ったことではないのですけど、必ず例外処理を記述しなければならないメソッドがあります。先ほどの"createNewFile"メソッドの説明文の最初の部分を見てください。 public boolean createNewFile() throws IOException では例外処理を付け加えた形で書き直してみます。 File newfile = new File("./tmp/newfile.txt"); try{ newfile.createNewFile(); }catch(IOException e){ System.out.println(e); }現時点ではあまり深く考えなくてもいいのですが、例外が発生しそうな記述をtry{}の括弧の中に記述します。このtry{}の中に書かれたプログラムを実行中に例外が発生すると、プログラムを強制終了させるかわりにcatch{}の中に書かれた処理を変わりに実行します。ここではエラーの内容を表示するだけにしています。 try{ // 例外が発生するプログラム // 例外が発生するプログラム // 例外が発生するプログラム }catch(発生した例外1 変数){ // 例外1が発生した時の処理 }catch(発生した例外2 変数){ // 例外2が発生した時の処理 }では一度試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; import java.io.IOException; class fileTest4{ public static void main(String args[]){ File newfile = new File("newfile.txt"); try{ if (newfile.createNewFile()){ System.out.println("ファイルの作成に成功しました"); }else{ System.out.println("ファイルの作成に失敗しました"); } }catch(IOException e){ System.out.println(e); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd File]$ java fileTest4 ファイルの作成に成功しました [xxxxxxxx@dddddddddd File]$ファイルが作成されていることを確認しておいて下さい。また、IOExceptionを使いますのでプログラムの最初の部分で「import java.io.IOException;」が必要となります。 また続けて同じプログラムを実行すると、今度は作成しようとする新しいファイルが1回目のプログラムで作成されているので、2回目に実行するとファイルの作成に失敗します。 [xxxxxxxx@dddddddddd File]$ java fileTest4 ファイルの作成に失敗しました [xxxxxxxx@dddddddddd File]$ |
今度はディレクトリを作成してみます。Fileクラスで用意されている"mkdir"メソッドを使います。 mkdir public boolean mkdir()この抽象パス名が示すディレクトリを生成します。 戻り値: ディレクトリが生成された場合は true、そうでない場合は false 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkWrite(java.lang.String) メソッドが指定されたディレクトリの生成を 許可しない場合 では作成方法を順を追って見ていきます。まずは作成しようとするディレクトリ名でFileクラスのオブジェクトを作成します。 File newdir = new File("./tmp/sub");次に作成したFileクラスのオブジェクトに対して"mkdir"メソッドを実行します。 File newdir = new File("./tmp/sub"); newdir.mkdir();これでディレクトリが作成されました。 では一度試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; class fileTest5{ public static void main(String args[]){ File newfile = new File("sub"); if (newfile.mkdir()){ System.out.println("ディレクトリの作成に成功しました"); }else{ System.out.println("ディレクトリの作成に失敗しました"); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd File]$ java fileTest5 ディレクトリの作成に成功しました [xxxxxxxx@dddddddddd File]$実際に確認してみると下記のようにディレクトリが作成されています。 [xxxxxxxx@dddddddddd File]$ ll 省略 -rw-rw-r-- 1 wwwadmin wwwadmin 950 1月 24 08:14 fileTest9.class -rw-r--r-- 1 wwwadmin wwwadmin 670 1月 24 08:14 fileTest9.java -rw-r--r-- 1 wwwadmin wwwadmin 37185 1月 31 08:20 index.html -rw-r--r-- 1 wwwadmin wwwadmin 0 1月 31 08:16 newfile.txt drwxr-xr-x 2 wwwadmin wwwadmin 10 1月 31 08:37 sub -rw-rw-r-- 1 wwwadmin wwwadmin 91 11月 7 2015 test.txt -rw-r--r-- 1 wwwadmin wwwadmin 415 1月 30 15:49 ww00.txt 省略 [xxxxxxxx@dddddddddd File]$ 親ディレクトリがまだ存在しないディレクトリの作成先ほどは既にあるディレクトリの中に別のディレクトリを作成しました。今度は親ディレクトリもまとめて作成してみます。親ディレクトリもまとめてとは、例えばCドライブには「temp」というディレクトリはありませんけど、「c:\temp\sub」といった親ディレクトリもまだ存在しない「sub」というディレクトリを作成してみます。サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; class fileTest6 { public static void main(String args[]){ File newfile = new File("./temp/sub"); if (newfile.mkdir()){ System.out.println("ディレクトリの作成に成功しました"); }else{ System.out.println("ディレクトリの作成に失敗しました"); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd File]$ java fileTest6 ディレクトリの作成に失敗しました [xxxxxxxx@dddddddddd File]$今度は失敗しました。「mdir」には親ディレクトリが存在していないような状態でディレクトリを作成することは出来ないためです。 このような場合には親ディレクトリから1つ1つ作成していくか、またはFileクラスで用意されている"mkdirs"メソッドを使います。 mkdirs public boolean mkdirs()この抽象パス名が示すディレクトリを生成します。存在していないが必要な親ディレクトリも一緒に作成されます。このオペレーションが失敗した場合でも、いくつかの必要な親ディレクトリの生成には成功している場合があります。 戻り値: 必要なすべての親ディレクトリを含めてディレクトリが生成された場合は true、そうでない場合は false 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマ ネージャの SecurityManager.checkRead(java.lang.String) メソッド が指定されたディレクトリと、必要なすべての親ディレクトリの存在確 認を許可しない場合。 または、SecurityManager.checkWrite(java.lang.String) メソッドが 指定されたディレクトリと、必要なすべての親ディレクトリの生成を 許可しない場合 "mkdirs"メソッドの場合、作成しようとするディレクトリの親ディレクトリなどがなかった場合には、親ディレクトリも含めてまとめて作成してくれます。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; class fileTest7 { public static void main(String args[]){ File newfile = new File("./temp/sub"); if (newfile.mkdirs()){ System.out.println("ディレクトリの作成に成功しました"); }else{ System.out.println("ディレクトリの作成に失敗しました"); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd File]$ java fileTest7 ディレクトリの作成に成功しました [xxxxxxxx@dddddddddd File]$今度は成功しました。実際に確認してみると下記のようになっています。 [xxxxxxxx@dddddddddd File]$ ll ./temp 合計 0 drwxr-xr-x 2 wwwadmin wwwadmin 10 1月 31 09:04 sub [xxxxxxxx@dddddddddd File]$作成しようとして「sub」ディレクトリも、存在していなかった親ディレクトリの「temp」も、まとめて作成されています。 |
今度はファイルを削除してみます。その前に、指定したファイルが存在しているかどうかの確認する方法を見ておきましょう。Fileクラスで用意されている"exists"メソッドを使います。 exists public boolean exists()この抽象パス名が示すファイルまたはディレクトリが存在するかどうかを判定します。 戻り値: この抽象パス名が示すファイルまたはディレクトリが存在する場合は true、そうでない場合は false 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkRead(java.lang.String) メソッドがファイルまたはディレクトリへの読 み込みアクセスを許可しない場合 確認したいファイル又はディレクトリを元にFileクラスのオブジェクトを作成し、"exists"メソッドを実行すると存在しているかどうかの判別が行えます。例えば下記のような感じです。 File file = new File("c:\\tmp\\newfile.txt"); if (file.exists()){ System.out.println("ファイルは存在します"); }else{ System.out.println("ファイルは存在しません"); }次に削除です。Fileクラスで用意されている"delete"メソッドを使います。 delete public boolean delete()この抽象パス名が示すファイルまたはディレクトリを削除します。このパス名がディレクトリを示す場合、そのディレクトリが削除されるためには空である必要があります。 戻り値: ファイルまたはディレクトリが正常に削除された場合は true、そうでない場合は false 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkDelete(java.lang.String) メソッドがファイルへの削除アクセスを許可しない場合 使い方としては下記の通りです。 File newdir = new File("./tmp/sub"); newdir.delete();ファイルでもディレクトリでも削除できます。 では一度試してみましょう。まず削除対象のファイルが存在しているか確認したうえで削除してみます。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; class fileTest8{ public static void main(String args[]){ File file = new File("newfile.txt"); if (file.exists()){ if (file.delete()){ System.out.println("ファイルを削除しました"); }else{ System.out.println("ファイルの削除に失敗しました"); } }else{ System.out.println("ファイルが見つかりません"); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd File]$ java fileTest8 ファイルを削除しました [xxxxxxxx@dddddddddd File]$もう一度同じプログラムを実行すると、今度はファイルが削除されて存在しないため失敗します。 [xxxxxxxx@dddddddddd File]$ java fileTest8 ファイルが見つかりません [xxxxxxxx@dddddddddd File]$ |
Windowsの場合ファイルを「読み取り専用」には出来ると思いますけど、見ることも出来ないように出来るかどうかちょっと分かりません。ここではファイルの現在のパーミッション(ファイルに対する読む権限や書く権限などのこと)を確認したり変更したりする方法を見ておきます。 まずは確認する方法です。該当のファイルが読めるかどうかの確認にはFileクラスの"canRead"メソッドを、書き込みが出来るかどうかの確認にはFileクラスの"canWrite"メソッドを使います。 canReadメソッド: canRead public boolean canRead()この抽象パス名が示すファイルをアプリケーションが読み込めるかどうかを判定します。 戻り値: この抽象パス名が示すファイルが存在し、さらにアプリケーションがそれを読み込める場合だけ true、そうでない場合は false 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkRead(java.lang.String) メソッドがファイルへの読み込みアクセスを 許可しない場合 canWriteメソッド: canWrite public boolean canWrite()この抽象パス名が示すファイルをアプリケーションが修正できるかどうかを判定します。 戻り値: ファイルシステムにこの抽象パス名が示すファイルが実際にあり、さらにアプリケーションがその ファイルに書き込める場合は true、そうでない場合は false 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkWrite(java.lang.String) メソッドがファイルへの書き込みアクセスを 許可しない場合 どちらのメソッドも、確認したい対象のファイル名を元にFileクラスのオブジェクトを作成し、そのオブジェクトに対して"canRead"メソッドや"canWrite"メソッドを実行します。例えば下記のようになります。 File file = new File("c:\\tmp\\newfile.txt"); if (file.canRead()){ System.out.println("ファイルは読み込み可能です"); } if (file.canWrite()){ System.out.println("ファイルは書き込み可能です"); }次に権限を変更する方法です。よく見てみたら「書き込み不可」にするメソッドはありましたが、「読み込み不可」のメソッドはありませんでした。書き込み不可(読み取り専用)にするにはFileクラスで用意されている"setReadOnly"メソッドを使います。 setReadOnly public boolean setReadOnly()この抽象パス名が示すファイルまたはディレクトリにマークを設定し、読み込みオペレーションだけが許可されるようにします。このメソッドを呼び出すと、ファイルまたはディレクトリはそれが削除されるか、書き込みアクセスを許可するようにマークを設定するまで変更されません。読み取り専用ファイルまたはディレクトリが削除できるかどうかは、背後のシステムに依存します。 戻り値: オペレーションが成功した場合は true、そうでない場合は false 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkWrite(java.lang.String) メソッドが指定されたファイルへの書き込み アクセスを許可しない場合 使い方は今までと同じです。対象のファイル名を元にFileクラスのオブジェクトを作成し、そのオブジェクトに対して"setReadOnly"メソッドを実行します。例えば下記のようになります。 File file = new File("c:\\tmp\\newfile.txt"); if (file.setReadOnly()){ System.out.println("ファイルを読み取り専用にしました"); }else{ System.out.println("読み取り専用に変更が失敗しました"); }では一度試してみましょう。下記では「読み取り可」「書き込み可」のファイルのパーミッションを調べて、その後「読み取り専用」に変更します。そして改めてパーミッションを調べます。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; class fileTest9{ public static void main(String args[]){ File file = new File("test.txt"); checkPermission(file); if (file.setReadOnly()){ System.out.println("ファイルを読み取り専用にしました"); }else{ System.out.println("読み取り専用に変更が失敗しました"); } checkPermission(file); } private static void checkPermission(File file){ if (file.canRead()){ System.out.println("ファイルは読み込み可能です"); } if (file.canWrite()){ System.out.println("ファイルは書き込み可能です"); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd File]$ java fileTest9 ファイルは読み込み可能です ファイルは書き込み可能です ファイルを読み取り専用にしました ファイルは読み込み可能です [xxxxxxxx@dddddddddd File]$該当のファイルのプロパティを確認してみます。 [xxxxxxxx@dddddddddd File]$ ll test.txt -rw-rw-r-- 1 wwwadmin wwwadmin 91 11月 7 2015 test.txt [xxxxxxxx@dddddddddd File]$実行前は、上記のように読み書き可能でしたが、実行後は、下記のように「読み取り専用」に設定されています。 [xxxxxxxx@dddddddddd File]$ ll test.txt -r--r--r-- 1 wwwadmin wwwadmin 91 11月 7 2015 test.txt [xxxxxxxx@dddddddddd File]$Windows10 の環境では、このコードで属性設定できない。PowerShell または cmd 経由でラッパーが必要か? 所詮、パーソナル・ユースなら、必要ないな。 次に権限を変更する方法です。書き込み不可(読み取り専用)から「書き込みおよび読み込み可能」にするにはFileクラスで用意されている"setWritable"メソッドを使います。 setWritable public boolean setReadOnly()この抽象パス名が示すファイルまたはディレクトリにマークを設定し、書き込みおよび読み込みオペレーションが許可されるようにします。 戻り値: オペレーションが成功した場合は true、そうでない場合は false 例外: SecurityException - セキュリティマネージャが存在し、セキュリティマネージャの SecurityManager.checkWrite(java.lang.String) メソッドが指定されたファイルへの書き込み アクセスを許可しない場合 使い方は今までと同じです。対象のファイル名を元にFileクラスのオブジェクトを作成し、そのオブジェクトに対して"setReadOnly"メソッドを実行します。例えば下記のようになります。 if (file.setWritable( true )){ System.out.println("ファイルを書き込み可能にしました"); }else{ System.out.println("書き込み可能への変更が失敗しました"); }では一度試してみましょう。上記の fileTest9.java で「読み込み専用」のファイルを、「書き込み可能」に戻してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。/* fileTest10.java は、書き込み可能への変更するものです。 H.Kamifuji が追加作成しました。 */ import java.io.File; class fileTest10 { public static void main(String args[]){ File file = new File("test.txt"); checkPermission(file); if (file.setWritable( true )){ System.out.println("ファイルを書き込み可能にしました"); }else{ System.out.println("書き込み可能への変更が失敗しました"); } checkPermission(file); } private static void checkPermission(File file){ if (file.canRead()){ System.out.println("ファイルは読み込み可能です"); } if (file.canWrite()){ System.out.println("ファイルは書き込み可能です"); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd File]$ java fileTest10 ファイルは読み込み可能です ファイルを書き込み可能にしました ファイルは読み込み可能です ファイルは書き込み可能です [xxxxxxxx@dddddddddd File]$該当のファイルのプロパティを確認してみます。 [xxxxxxxx@dddddddddd File]$ ll test.txt -rw-rw-r-- 1 wwwadmin wwwadmin 91 11月 7 2015 test.txt [xxxxxxxx@dddddddddd File]$実行前は、上記のように「読み取り専用」から「書き込み可能」に設定されています。 [xxxxxxxx@dddddddddd File]$ ll test.txt -rw-r--r-- 1 wwwadmin wwwadmin 91 11月 7 2015 test.txt [xxxxxxxx@dddddddddd File]$Windows10 の環境では、このコードで属性設定できない。PowerShell または cmd 経由でラッパーが必要か? 所詮、パーソナル・ユースなら、必要ないな。 |
|